2014-02-17 4 views
1

Недавно я наткнулся на этот код, и я не могу понять, как это работаетс помощью вложенных PRINTF заявления дает странный вывод

#include<stdio.h> 
int main(){ 
    printf("Line 1\n", 
    printf("Line 2\n", 
    printf("Line 3\n", 
    printf("Line 4\n", 
    0)))); 
return 0; 
} 

Это дает следующий результат:

Line 4 
Line 3 
Line 2 
Line 1 
+1

Что в этом плохого? Сначала выполняется внутренний вызов. –

+0

нет спецификатора формата, каково значение написания другого printf или 0 в вышеуказанной программе после содержимого «» – codeln

+2

Позвольте мне угадать ... написанный программистом Lisp. – ninjalj

ответ

4

printf используется для печати отформатированной линии. Например, чтобы напечатать целое, вы звоните:

printf("%d", 1); 

То, что вы сделали, это вызвать его с возвращаемым значением вложенного print в качестве аргумента, что означает, что в первую очередь необходимо оценить вложенный вызов. Ваш звонок похож на:

int temp; 
temp = printf("Line 4\n", 0); 
temp = printf("Line 3\n", temp); 
temp = printf("Line 2\n", temp); 
temp = printf("Line 1\n", temp); 

Кроме того, обратите внимание, что, поскольку у вас нет спецификаторов формата в строке формата, нет никакого смысла второго аргумента, и если ваш компилятор достаточно хорошо это будет даже предупредить вас о что.

4

Это ISN» Странно. Выражения оцениваются (выполняются) изнутри наружу, как и математические выражения.

Таким образом, сформулируйте простые условия: выражение с наибольшими скобками вокруг него оценивается/выполняется сначала.

Упрощенная это:

printf("1", printf("2", printf("3", printf("4")))); 
+0

'выражение с наибольшими скобками вокруг него оценивается/выполняется первым.' Может вводить в заблуждение, поскольку оно не совсем верно. Или это? Что делать, если у вас есть выражение с дерьмовой нагрузкой операций, требующих дерьма загрузки parens и его в первом printf? –

3

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

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