Intereting Posts
GDB Не удается вставить точку останова, Не удается получить доступ к памяти по адресу XXX? Могут ли все функции в streamе иметь доступ к динамически распределенной памяти (куче) даже без указания указателя или локально для функции? Уменьшение размера 2D-массива и удаление из него определенной строки Как изменить область _particular_ в памяти? Смена строки функции C с помощью указателя Как перевернуть показатель двойника (например, 1e300-> 1e-300)? Параметр OpenMP для уменьшения приводит к неправильным результатам Всплеск CentOS 6.5 Совершенное сбалансированное двоичное дерево поиска printf () печатает весь массив Странное поведение printf () Почему двойной список в sys / queue.h поддерживает адрес предыдущего следующего элемента? Стирание внешнего FLASH Двойной маятниковый раствор с использованием GSL Почему оператор «continue» игнорирует приращение счетчика циклов в цикле «while», но не в цикле «for»?

использование вложенных команд printf, дающих странный вывод

Недавно я столкнулся с этим кодом, и я не могу понять, как он работает

#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")))); 

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