为何`\`会影响printf返回值?嵌套printf输出为何是65 4而非65 3?
嵌套printf返回值的疑问解答
先把你的代码贴出来方便分析:
#include<stdio.h> int main() { int a=65; printf("%d\n",printf("%d\ \n",a)); return 0; }
首先得搞懂一个关键知识点:printf函数的返回值是它成功输出到屏幕的字符总数——不管是数字、空格、换行符,还是反斜杠这种特殊字符,每被打印一个就计数一次。
现在来拆解内层那个printf("%d\ \n",a)的行为:
%d会把变量a的65转换成字符串"65",这是2个字符('6'和'5')。- 格式串里的
\:在C语言里,单独的\后面跟空格属于未定义的转义序列,但像GCC这类常用编译器,一般会把它处理成两种情况之一:要么把\和空格当作两个独立字符输出,要么忽略\只保留空格。但不管哪种情况,都会比没有\的时候多一个输出字符。 - 最后的
\n是换行符,算1个字符。
你说实际输出是65 4,其实应该是两行:第一行是65加上额外的那个字符(空格或反斜杠)然后换行,第二行是4然后换行,只是你可能把换行当成空格描述了。而内层printf返回4,说明它总共输出了4个字符——比如如果编译器忽略了\只保留空格,那就是65+空格+换行,刚好4个字符,返回值自然是4,外层printf就会把这个4打印出来。
那为什么\会影响返回值呢?
- 如果去掉这个
\,格式串就变成了"%d\n",内层printf只会输出65+换行,总共3个字符,返回值就是3,外层printf就会打印3。 - 加上
\之后,不管编译器是把它解析成一个反斜杠字符,还是只保留空格,都会让输出的字符数从3增加到4,所以返回值就跟着变成了4,外层的结果也就变成了4。
内容的提问来源于stack exchange,提问作者beta_me me_beta
相关产品推荐
相关产品推荐

