来自嵌套printf statemenets的奇怪输出

The*_*584 1 c printf output

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

int i = 8;
printf("%d", printf("%o", i));
Run Code Online (Sandbox Code Playgroud)

结果这是102,我不知道怎么样,我知道八进制中的8是10,但最让我困惑的是当我把这样的空间放在%o这之后

printf("%d", printf("%o ", i));
Run Code Online (Sandbox Code Playgroud)

现在,结果是10 3,这里发生了什么?

Sou*_*osh 5

外部printf()将打印内部的返回值printf().

引用C11,章节§7.21.6.1,

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

所以,在第一种情况下,

 printf("%d", printf("%o", i));
Run Code Online (Sandbox Code Playgroud)

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

同样,当在内侧的格式说明后放的空间printf(),将打印(和返回)3,所以之后的10 <space>,3被打印.


Aus*_*Aus 5

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

10 3

这是:

10是评估的内部printf,其打印八进制8.

3,评估的外部printf打印内部printf = 3个打印字符的"返回"值.