如何解释这个简单C代码的输出?

#include int main() { int i=10; printf("%d",printf("%d",i)); return(0); } 

Turbo C中的输出

102

我是初学者。 那你能解释一下这段代码的工作原理吗?

printf的文档声明它将返回一个整数,该整数表示写入输出流的字符数。

这意味着你可以使用printf的返回值来满足另一个printf调用中的%d格式说明符,而第二个(外部)调用将打印出第一个调用中写入的字符数。

i等于10 ,所以第一次调用printf输出数字10并返回2 (字符串"10"中的字符数),这将传递给第二次调用printf ,打印2 ,给你最终输出102

让我们拆分产生输出的顶级语句:

 printf("%d",printf("%d",i)); 
  • 我们在顶层有一个printf函数调用,将两个参数传递给函数
  • 顶级printf的第一个参数是格式字符串"%d"
  • 顶级printf的第二个参数是调用printf("%d",i)

顶级printf的参数,即printf("%d",i) ,需要在进行调用之前进行评估。 表达式具有值和副作用。 副作用是将"10"打印到输出,值是打印的字符数,即2

由于在进行调用之前计算参数,因此首先调用printf("%d",i) ,生成输出10 。 现在调用顶级printf ,它产生输出2 ,完成你看到的"102"序列。

printf()是一个C函数。 它返回一个等于它打印的字节数的int值。

在你的情况下,INNER printf打印“10”,所以它写了2个字节,将返回2。

因此,OUTER printf将打印“2”。

最终结果:“102”(INNER的“10”后跟OUTER的“2”)。

引用C11 ,第7.21.6.1章

fprintf函数返回传输的字符数,如果发生输出或编码错误,则返回负值。

在您的情况下,内部printf()调用是外部printf()的参数,因此将根据函数参数评估规则执行内部函数调用。

因此,在您的情况下,首先执行内部printf() ,打印i的值,即10 (2个字符),并将printf()调用的返回值用作外部%d格式说明符的参数printf() ,打印2

由于没有可视分隔符,您会看到彼此相邻的输出,显示为102