C++ 操作符优先级问题 三目运算符右结合问题

运算符优先级

三目运算符右结合说明

大多数运算符都没有规定表达式中运算对象的求值顺序,对于互不影响的函数之间,这并没有什么问题,但如果这几个函数共同影响同一个全局变量就会出现问题。

因此在C++ Primer第五版的123页中才会有这么一说:

“因为表达式的行为不可预知,因此不论编辑器生成什么样的代码程序都是错误的。”

是的,因为求值顺序没有规定,怎么样都有可能,这样的代码即使语法毫无问题,他也是错误的!

所以有两条经验准则用于书写复合表达式:

1. 拿不准的时候最好用括号来强制让表达式的组合关系符合程序逻辑的要求。

2. 如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象

这四个特殊的运算符规定了求值顺序和计算方向,它们分别如下:

1. 逻辑与&&,先求左侧对象,左侧为真,再求右侧,左侧为假,则不再求右侧

2. 逻辑或 || ,先求左侧对象,左侧为假,再求右侧,左侧为真,则不再求右侧

3. 条件运算符 条件 ? 表达式1 : 表达式2 ,先对条件判断,为真,对表达式1进行计算,为假,对表达式2进行计算

4. 逗号运算符“,”先求逗号运算符左侧的值,然后再对表达式右侧的求值。

其中,第一条和第二条的求值策略,我们给它一个术语,叫做:short-circuit-evaluation(短路求值)。 

最后梳理一下,对于条件运算符,它是右结合的,对于 a ? b : c ? d : e这样的符合表达式,将最右边优先结合视为一个整体,相当于a ? b : (c ? d : e),但是并不是先对这个运算对象进行求值,如果没有规定求值顺序,可能先求b,也可能先求(c ? d : e),也可能先求a,然后再把a或b的最终结果或者(c ? d : e)的最终结果拿来从右向左开始参与表达式运算。也即运算对象求值不知道谁优先,但是表达式计算方向却是从右先左的。

但是条件运算符规定了求值的顺序和计算方向,必须先求条件a,然根据a的真假来求b或者(c ? d : e)。因此这里的右结合只起了怎么组合该复合表达式的作用,最终的求值顺序和表达式计算方向被该运算符的规定指明了。

    原文作者:明月千里赴迢遥
    原文地址: https://blog.csdn.net/qq_54886579/article/details/119429812
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞