2016-08-20 6 views
0

Итак, я написал функцию, которая должна вернуть n-й номер Фибоначчи, но я забыл фактически вернуть свой результат. Я получил предупреждение «контроль до конца не-пустоты», но код выполнил штраф и вернул правильный результат. Почему это? Как C знает, что он должен вернуть «результат»?Функция C возвращает правильный результат, но не возвращается оператор возврата, почему?

int fib (int n); 

int main(int argc, char** argv) { 
    printf("%d", fib(10)); 

} 

int fib (int n){ 
    unsigned long long result = 1; 
    unsigned long long aux = 0; 

    while (n > 1){ 
     result += aux; 
     aux = result; 
     n--; 
    } 
} 

Он вернулся этот

256 

Я пытался добавить

int j = n+1 

к последней строке функции, а затем она фактически возвращается 2, а не 256. Это ошибка, или как c читает что-то вроде этого?

+4

Неопределенное поведение - неопределенное поведение. Одна из возможностей заключается в том, что * кажется * работать. –

+0

И, кстати, он * не работает. Если функция 'fib' должна возвращать n: th число Фибоначчи, то результат, который вы получите, фактически неверен, это должно быть' 55'. –

+0

кричит, что вы правы! Но мой алгоритм ошибочен, то, что я имел в виду с «работами», заключается в том, что он компилирует и возвращает окончательное значение переменной результата. – yeahboy

ответ

4

Достижение конца функции без void без оператора return вызывает неопределенное поведение. Получение ожидаемого результата - это форма неопределенного поведения, которое обычно называется удачей. Кстати, 256 может быть тем, что вы ожидали, но это не правильно.

Возможное объяснение: последнее значение, вычисленное функцией и сохраненное в регистре, которое обычно содержит возвращаемое значение, является ожидаемым результатом.

Конечно, вы никогда не должны полагаться на это и не ожидать этого.

Это хороший пример использования предупреждений компилятора: не игнорируйте их. Всегда включайте больше предупреждений компилятора и исправьте код. gcc -Wall -W или clang -Weverything может обнаружить много глупых ошибок и сэкономить часы отладки.

Вот некоторые другие проблемы:

  • не включают <stdio.h>
  • вы вычислите unsigned long long но возвращать только, вероятно, меньший тип int
  • ваш алгоритм вычисляет силы 2, а не числа Фибоначчи.