C 使用嵌套的printf语句提供奇怪的输出

C 使用嵌套的printf语句提供奇怪的输出,c,printf,C,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; } 这一点也不奇怪。 表达式从内部到外部进行计算(执行),就像数学表达式一样 简单来说:首先计算/执行括号最多的表达式 它是: printf("1",

我最近遇到了这个代码,我无法理解它是如何工作的

#include<stdio.h>
int main(){
    printf("Line 1\n",
    printf("Line 2\n",
    printf("Line 3\n",
    printf("Line 4\n",
    0))));
return 0;
}
这一点也不奇怪。 表达式从内部到外部进行计算(执行),就像数学表达式一样

简单来说:首先计算/执行括号最多的表达式

它是:

printf("1", printf("2", printf("3", printf("4"))));
这一点也不奇怪。 表达式从内部到外部进行计算(执行),就像数学表达式一样

简单来说:首先计算/执行括号最多的表达式

它是:

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

在实际调用函数之前,需要对其参数求值。因此,首先调用最内部的print。

在实际调用函数之前,需要计算函数的参数。因此,最内部的打印被称为第一行。

用于打印格式化行。例如,要打印整数,请调用:

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( "%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或0有什么意义让我猜猜。。。由一个Lisp程序员编写。我们将拭目以待,看看调用printf可以对哪种表达式求值,对所有表达式求值都是一样的。最后一个先被计算,它被发回,然后是第三个,然后是第二个和第一个,等等。这些都是函数调用,没什么更复杂的。除了我说的,试着一个接一个地计算它们,没有任何格式说明符。在
return
中得到的结果与嵌套这些函数调用时发生的情况相同。归根结底,这仍然是一个循序渐进的过程。刚看到MByD的答案,他/她解释得很好。有什么问题吗?首先解决最内部的调用。没有格式说明符,在“”的内容之后在上面的程序中写入另一个printf或0有什么意义让我猜猜。。。由一个Lisp程序员编写。我们将拭目以待,看看调用printf可以对哪种表达式求值,对所有表达式求值都是一样的。最后一个先被计算,它被发回,然后是第三个,然后是第二个和第一个,等等。这些都是函数调用,没什么更复杂的。除了我说的,试着一个接一个地计算它们,没有任何格式说明符。在
return
中得到的结果与嵌套这些函数调用时发生的情况相同。归根结底,这仍然是一个循序渐进的过程。刚刚看到MByD的答案,他/她解释得很好。
首先计算/执行括号最多的表达式。
可能会产生误导,因为它不完全正确。还是这样?如果有一个表达式包含大量的操作,需要在第一个printf中包含大量的parens及其参数,该怎么办?
首先计算/执行包含最多括号的表达式。
可能会产生误导,因为它不完全正确。还是这样?如果有一个表达式需要大量的parens操作,并且它在第一个printf中需要大量的parens操作,那该怎么办?