使用嵌套的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")))); 

您需要在实际调用之前评估函数的参数。 所以最内层的印刷首先被称为。