C语言中a = a + b - (b=a)表达式的求值规则疑问
C语言中
a = a + b - (b=a)的求值逻辑解析 首先纠正核心误区:运算符优先级/结合性只决定表达式的语法结构,不决定子表达式的求值顺序。你之前的错误在于默认括号内的子表达式一定会先执行,但这在C语言里并不成立。
这个表达式的语法结构是
a = ((a + b) - (b=a))(因为+、-优先级高于赋值=),但结构确定后,编译器可以选择先计算a + b,也可以先计算(b=a),这属于未指定行为——C标准不对这种顺序做强制要求,不同实现可能有不同结果。你看到的实际结果对应的求值流程:
- 先计算
a + b:用初始值a=10、b=20,得到结果30; - 计算括号内的
b=a:将a的当前值10赋值给b(此时b变为10),同时这个赋值表达式的结果就是10; - 计算
30 - 10,得到20; - 最后将
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
相关产品推荐
相关产品推荐

