【问题标题】:Strange output from nested printf statemenets嵌套 printf 语句的奇怪输出
【发布时间】:2017-03-03 12:49:11
【问题描述】:

好的,我正在玩一些代码,试图理解一些技巧以及它是如何工作的,所以我不明白这段代码的输出

int i = 8;
printf("%d", printf("%o", i));

这个结果是102,我不知道怎么回事,我知道八进制中的8是10,但最让我困惑的是当我像这样在%o后面加空格时

printf("%d", printf("%o ", i));

现在,结果是 10 3,这是怎么回事?

【问题讨论】:

  • @Jean-FrançoisFabre printf 返回int
  • 首先打印i,然后打印i 的打印结果。您是否查看过printf 的文档以查看它返回的内容?
  • @Jean-FrançoisFabre,不,printf 返回写入的字符总数。
  • 如果您使用printf("%d", printf("12"));printf("%d", printf("123"));,您会得到相同的结果。八进制数与它无关。

标签: c printf output


【解决方案1】:

外部printf()会打印内部printf()的返回值。

引用C11,第 7.21.6.1 章,

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

所以,在第一种情况下,

 printf("%d", printf("%o", i));

内部printf() 打印10,即两个字符,这是调用的返回值,外部printf() 打印它。两个相邻打印语句的输出显示为102

同样,当您在内部printf() 的格式说明符之后放置一个空格时,它会打印(并返回)3,所以在10 <space> 之后,会打印3

【讨论】:

  • 啊,原来如此,原来10后的数字其实是印刷字符的个数,甚至是空格数,我现在明白了,谢谢大家的快速解答
【解决方案2】:

Printf 打印到标准输出,并返回 int,即打印字符数。 所以你得到:

10 3

这是:

10 是打印八进制 8 的评估内部 printf。

和 3,打印内部 printf = 3 个打印字符的“返回”值的评估的外部 printf。

【讨论】:

    【解决方案3】:
    int i = 8;
    printf("%d", printf("%o", i));
    

    printf 返回它打印的字符数,之前打印 10 时为 2。评估顺序意味着您将获得102 作为输出。或者更确切地说是10,然后是2,中间没有换行符或空格。

    在你的第二个例子中,你得到10(注意空格)然后310是3个字符,{'1','0',' '})作为printf的返回值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      相关资源
      最近更新 更多