You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:22:05