Недавно я столкнулся с этим кодом, и я не могу понять, как он работает
#include 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
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);
Также обратите внимание, что, поскольку у вас нет спецификаторов формата в строке формата, во втором аргументе нет смысла, и если ваш компилятор достаточно хорош, он даже предупредит вас об этом.
Это совсем не странно. Выражения оцениваются (выполняются) изнутри наружу, как и математические выражения.
Поэтому ставьте простые термины: выражение с наибольшими скобками вокруг него сначала оценивается / выполняется .
Упрощено это:
printf("1", printf("2", printf("3", printf("4"))));
Вам нужно оценить параметр функции до ее фактического вызова. Таким образом, самая внутренняя печать называется первой.