当前位置:嗨网首页>书籍在线阅读

19-运算符优先级和结合性

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

3.4.1 运算符优先级和结合性

读者是否委托C++来完成复杂的算术运算?是的,但必须知道C++使用的规则。例如,很多表达式都包含多个运算符。这样将产生一个问题:究竟哪个运算符最先被使用呢?例如,请看下面的语句:

int flyingpigs = 3 + 4 * 5; // 35 or 23?

操作数4旁边有两个运算符:+和。当多个运算符可用于同一个操作数时,C++使用优先级规则来决定首先使用哪个运算符。算术运算符遵循通常的代数优先级,先乘除,后加减。因此3+45指的是3+(45),而不是(3+4)5,结果为23,而不是35。当然,可以使用括号来执行自己定义的优先级。附录D介绍了所有C++运算符的优先级。其中,*、/和%位于同一行,这说明它们的优先级相同。同样,加和减的优先级也相同,但比乘除低。

有时,优先级列表并不够用。请看下面的语句:

float logs = 120 / 4 * 5; // 150 or 6?

操作数4也位于两个运算符中间,但运算符/和*的优先级相同,因此优先级本身并不能指出程序究竟是先计算120除以4,还是先计算4乘以5。因为第一种选择得到的结果是150,而第二种选择的结果是6,因此选择十分重要。当两个运算符的优先级相同时,C++将看操作数的结合性(associativity)是从左到右,还是从右到左。从左到右的结合性意味着如果两个优先级相同的运算符被同时用于同一个操作数,则首先应用左侧的运算符。从右到左的结合性则首先应用右侧的运算符。附录D也列出了结合性方面的信息。从中可以看出,乘除都是从左到右结合的。这说明应当先对4使用左侧的运算符。也就是说,用120除以4,得到的结果为30,然后再乘以5,结果为150。

注意,仅当两个运算符被用于同一个操作数时,优先级和结合性规则才有效。请看下面的表达式:

int dues = 20 * 5 + 24 * 6;

运算符优先级表明了两点:程序必须在做加法之前计算205,必须在做加法之前计算246。但优先级和结合性都没有指出应先计算哪个乘法。读者可能认为,结合性表明应先做左侧的乘法,但是在这种情况下,两个*运算符并没有用于同一个操作数,所以该规则不适用。事实上,C++把这个问题留给了实现,让它来决定在系统中的最佳顺序。对于这个例子来说,两种顺序的结果是一样的,但是也有两种顺序结果不同的情况。在第5章讨论递增运算符时,我们将介绍一个这样的例子。