C++中运算符结合性与求值顺序的区别是什么?
运算符结合性 vs 求值顺序:核心区别
什么是运算符结合性?
结合性只针对同一优先级的运算符,用来解决“多个同优先级运算符连续出现时,先算哪一组”的问题,本质是确定运算的分组方式:
- 左结合:从左到右分组,比如减法、除法:
a - b - c等价于(a - b) - c,先算左边的减法,再用结果减c。 - 右结合:从右到左分组,比如赋值、幂运算:
a = b = c等价于a = (b = c),先把c的值赋给b,再把b的结果赋给a。
什么是求值顺序?
求值顺序是指表达式中各个操作数(或子表达式)的计算先后顺序,和运算符的优先级、结合性完全无关。比如:
- 表达式
f() + g()中,f()和g()是两个操作数,很多编程语言(比如C、C++)里并没有规定先算哪个,编译器可以自由选择;而有些语言(比如Java)会规定从左到右求值。 - 再比如
a * (b + c),优先级决定了先算括号里的b + c,但如果a是x()、b是y()、c是z(),那是先算x(),还是先算y() + z()?这就是求值顺序的范畴,和优先级无关。
关键对比总结
- 运算符结合性:解决同优先级运算符的分组规则,决定运算的“结构”,不涉及操作数的计算顺序。
- 求值顺序:解决操作数的计算先后,和运算结构无关,只关乎子表达式的执行顺序。
举个直观的例子:a - b - c()
- 结合性决定了是
(a - b) - c(),而不是a - (b - c()); - 但求值顺序决定了:是先算
a,再算b,再算c(),还是先算c(),再算b,再算a?(不同语言规则不同)
内容的提问来源于stack exchange,提问作者Mohamedkhalaf
相关产品推荐
相关产品推荐

