C语言printf()语句行为疑问:为何输出与预期不符?
为什么单条printf语句的输出不符合预期?
这是因为C语言标准没有规定函数参数的求值顺序,不同编译器(甚至同一编译器的不同版本)可能采用不同的参数求值逻辑,这种场景属于标准定义的「未定义行为」——代码执行结果没有统一预期,完全依赖编译器实现。
针对你用GCC编译的情况,它对printf的参数采用从右往左的求值顺序:
- 首先计算最右侧的
k > 40:此时k的值还是初始的35,35大于40不成立,结果为0; - 接着计算中间的
k = 50:将k赋值为50,赋值表达式的结果就是50; - 最后计算最左侧的
k == 35:此时k已经被改成50了,50等于35不成立,结果为0;
所以最终输出就是0 50 0。
而拆分后的三条printf语句属于独立语句,C语言规定语句的执行顺序是严格从左到右的:
- 第一条printf执行时,k是35,
k == 35的结果为1; - 第二条printf执行
k = 50,把k改成50,输出50; - 第三条printf执行时,k是50,
k > 40的结果为1;
因此输出符合预期的1 50 1。
需要注意:永远不要在函数参数列表里同时进行变量赋值和依赖该变量的运算,这种代码的行为完全不可预测,是严重的不良编码习惯。
内容的提问来源于stack exchange,提问作者Pranshul
相关产品推荐
相关产品推荐

