printf()返回值未被使用时的去向及编译器处理逻辑问询
哈哈,这个问题问得特别接地气!我刚接触C语言的时候也琢磨过:明明printf有返回值,我从来不用它,那这值到底去哪了?编译器为啥还允许我这么干?咱们慢慢说清楚~
1. 没用的返回值去哪了?
当你直接写printf("Called func\n");而不接收返回值时,这个返回的字符数其实会被直接丢弃。
具体来说,C语言函数的返回值通常会存在CPU的某个寄存器里(比如x86架构里的eax寄存器),但因为你没有写代码把这个值存到变量或者用在其他地方,后续的程序指令很快就会覆盖这个寄存器里的内容,这个返回值也就彻底消失了——就像你买完东西老板找了零钱,你随手扔在路边,之后再也没人会管它的去向。
2. 编译器为啥允许忽略返回值?
这其实是C语言的设计规则决定的:函数的返回值是给调用者可选使用的,不是强制必须接收。
C标准里并没有规定必须使用所有函数的返回值,只有极少数特殊情况(比如main函数,如果没写return语句,编译器会默认帮你补return 0;)有特殊处理。对于printf这类函数,设计它的返回值是为了给需要的场景提供便利(比如你要统计打印了多少字符,或者检查打印是否成功——如果返回负数说明输出出错了),但如果你不需要这个信息,完全可以忽略它,这是合法的语法。
不过要提一句:有些编译器会提供警告选项来提醒你“忽略了返回值”,比如GCC的-Wunused-result参数。当你用这个选项编译时,忽略printf的返回值会得到类似这样的警告:
warning: ignoring return value of ‘printf’, declared with attribute warn_unused_result
但这只是编译器的善意提醒,不是语法错误,程序依然能正常编译运行。
举个实际的例子
你提到的printf("%d", printf("Called func\n"));就是个很好的演示:
- 内层的
printf("Called func\n")会先执行,打印字符串,同时返回它打印的字符数(这里是12个:"Called func"是11个字符加换行符\n)。 - 外层的
printf会把这个返回值(12)打印出来,所以最终输出是:
Called func 12
内容的提问来源于stack exchange,提问作者LoveOfLearning

