C语言printf函数参数求值顺序及输出结果解析
C语言printf参数执行顺序导致的输出问题
原代码
#include<stdio.h> int main() { printf("%d %d", printf("Hello World"), printf("New World")); }
实际运行输出
New WorldHello World11 9
原因解释
问题的核心在于C语言标准没有规定函数参数的求值顺序,不同编译器可自行实现参数计算顺序,目前主流编译器(比如GCC、Clang)默认采用从右到左的顺序处理函数参数:
- 外层
printf有两个参数:printf("Hello World")和printf("New World"),编译器会优先计算右侧参数 - 先执行
printf("New World"):输出字符串New World,该printf的返回值是输出的字符总数("New World"含9个字符,包括空格) - 再执行
printf("Hello World"):输出字符串Hello World,返回值是11("Hello World"含11个字符,包括空格) - 最后外层
printf将两个返回值按%d %d格式输出,即11 9 - 把所有输出内容拼接起来,就得到最终结果
New WorldHello World11 9
补充说明:如果换用其他编译器(比如部分老版本VC),可能采用从左到右的参数求值顺序,输出会变成Hello WorldNew World11 9,这同样符合C语言标准,因为标准并未强制参数的计算顺序。
内容的提问来源于stack exchange,提问作者Thang Tons
相关产品推荐
相关产品推荐

