2014-09-17 2 views
-6

Будет ли исполняться printf("hello") в функции fact()? Если да, то почему он не печатается при вызове функции в main? Если нет, то этот оператор return возвращает значение функции, и оператор printf("Hello") никогда не подходил.Делает ли заявление после возвращения встречные встречи даже после выполнения заявления после него

#include <stdio.h> 

int fact(int n) 
{ 
    if (n == 1) 
     return 1; 
    else 
     return (n * fact(n - 1)); 
    printf("Hello"); 
} 

main() 
{ 
    printf("%d", fact(6)); 
} 
+3

Вы пробовали? Почему вы думаете, что это произойдет или никогда не будет выполнено? Другими словами, почему вы задаете этот вопрос? – Evert

+0

«этот оператор возврата возвращает значение функции»: вы имеете в виду «возвращает значение в main»? – Evert

+0

Компилятор, скорее всего, полностью удалит вызов printf. –

ответ

0

Law of Excluded Middle невероятно полезно для формальных рассуждений о if отчетности , Эти два варианта, которые у вас есть в вашем коде следующим образом:

  • n равно 1 и
  • n является не равна 1.

В этой логике нет третьего «среднего» состояния.

Теперь вернемся к вашему коду и посмотрим, что произойдет в зависимости от значения n. Когда это 1, ваш код возвращает 1. Когда nне один, ваш код возвращает результат некоторых вычислений.

Для того, чтобы printf("Hello") быть достигнуто, n должна быть равна единице, а не равным единице, в то же время (т.е. n==1 && n!=1 должно быть истинным). Закон исключенного среднего позволяет математически доказать, что это выражение равно false для всех значений n, что означает, что строка printf недостижима при любых обстоятельствах. Оптимизация компиляторов C выдает предупреждение и удаляет этот «мертвый код» из исполняемого файла, который они генерируют.

0
int fact(int n) 
{ 
if(n==1) 
    return 1; //statement 1 
else 
    return (n*fact(n-1)); //statement 2 
printf("Hello"); 
} 

функция завершается с обратным утверждением. Оператор return указывает, что функция заканчивается, возвращая следующую информацию.

всякий раз, когда функция вызывается с любым значением п, функция всегда заканчивается выполнение в любом заявлении 1 или утверждение 2, и, таким образом, не достигает PRINTF ничего о

Смежные вопросы