如何解释这个简单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
。