C语言printf内表达式求值疑问:为何输出结果不符合预期?
为什么这段C代码的输出不符合预期?
先看代码:
#include <stdio.h> void main(){ int a = 2023; printf("%d %d %d",a!=2024,a=2021,a==2021); }
你疑惑为什么输出是1 2021 0而非1 2021 1,核心原因是C语言标准没有规定函数参数的求值顺序——编译器可选择从左到右、从右到左甚至其他顺序计算printf的参数,这属于标准定义的「未指定行为」。
在这个案例里,编译器采用了从右往左的求值顺序:
- 先计算最右侧的
a==2021:此时a还是初始值2023,2023与2021不相等,结果为0。 - 接着计算中间的
a=2021:执行赋值操作,将a的值改为2021,该表达式的结果就是赋值后的2021。 - 最后计算最左侧的
a!=2024:此时a已变为2021,2021不等于2024,结果为1。
将这三个结果按printf的格式输出,就得到了1 2021 0。
注意:这类依赖参数求值顺序的代码属于不良写法,更换编译器或调整优化级别都可能改变输出结果,实际编码中要绝对避免这类逻辑。
内容的提问来源于stack exchange,提问作者Aevo
相关产品推荐
相关产品推荐

