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

C语言中a = a + b - (b=a)表达式的求值规则疑问

C语言中a = a + b - (b=a)的求值逻辑解析
  • 首先纠正核心误区:运算符优先级/结合性只决定表达式的语法结构,不决定子表达式的求值顺序。你之前的错误在于默认括号内的子表达式一定会先执行,但这在C语言里并不成立。

  • 这个表达式的语法结构是a = ((a + b) - (b=a))(因为+、-优先级高于赋值=),但结构确定后,编译器可以选择先计算a + b,也可以先计算(b=a),这属于未指定行为——C标准不对这种顺序做强制要求,不同实现可能有不同结果。

  • 你看到的实际结果对应的求值流程:

    1. 先计算a + b:用初始值a=10、b=20,得到结果30;
    2. 计算括号内的b=a:将a的当前值10赋值给b(此时b变为10),同时这个赋值表达式的结果就是10;
    3. 计算30 - 10,得到20;
    4. 最后将20赋值给a,所以最终a=20,b=10。
  • 你预期的先算(b=a)的流程也是合法的,但C标准不保证编译器会这么做。这种依赖未指定求值顺序的代码属于不良写法,在实际开发中应该避免——如果需要明确的执行顺序,应该拆分表达式为多个语句(每个语句末尾的分号是序列点,能保证副作用的执行顺序),比如:

    b = a; // 先完成赋值,此时b=10
    a = a + b - b; // 再计算,a=10+10-10=10
    

内容的提问来源于stack exchange,提问作者Bilal Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:46:06