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

时间:2016-11-15 20:17:52

标签: c printf

#include<stdio.h>
int main()
{
int i=10;
printf("%d",printf("%d",i));
return(0);
}

Turbo C中的输出

  

102

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

4 个答案:

答案 0 :(得分:2)

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

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

i等于10,因此第一次调用printf会输出数字10并返回2(字符串中的字符数{ {1}}),传递给"10"的第二次调用,打印printf,为您提供最终输出2

答案 1 :(得分:1)

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

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"序列。

答案 2 :(得分:0)

引用/usr/local/bin/aws s3 mv /backup-directory/20161030002947.Pg s3://my-s3-bin/20161030002947.Pg ,章节§7.21.6.1

  

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

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

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

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

答案 3 :(得分:0)

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

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

OUTER printf因此会打印“2”。

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