Функция C возвращает правильный результат, но оператор возврата не задан, почему?

c return fibonacci

71 просмотра

1 ответ

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

int fib (int n);

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

}

int fib (int n){
   if (n == 1){
      return 1;
   }
   if (n == 0){
     return 0
   }
   fib(n-2) + fib(n-1)
}

Вернул это

55

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

 int j = n+1

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

Автор: yeahboy Источник Размещён: 08.11.2019 11:19

Ответы (1)


4 плюса

Решение

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

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

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

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

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

  • ты не включаешь <stdio.h>
  • Вы вычисляете, unsigned long longно возвращаете только, вероятно, меньший типint
  • Ваш алгоритм вычисляет степени 2, а не числа Фибоначчи.
Автор: chqrlie Размещён: 20.08.2016 12:50
32x32