附录D 操作符优先级
操作符优先级决定了操作符用于值的顺序。C++操作符分为18个优先级组,如表D.1所示。第1组中的操作符的优先级最高,第2组中操作符的优先级次之,依此类推。如果两个操作符被用于同一个操作数,则首先应用优先级高的操作符。如果两个操作符的优先级相同,则C++使用结合性规则来决定哪个操作符结合得更为紧密。同一组中操作符的优先级和结合性相同,不管是从左到右(表中L-R)还是从右到左(表中R-L)结合。从左到右的结合性意味着首先应用最左边的操作符,而从右到左的结合性则意味着首先应用最右边的操作符。
有些符号,如*或&,被用于多个操作符。在这种情况下,一种形式是一元(一个操作数),另一种形式是二元(两个操作数),编译器将根据上下文来确定使用哪种形式。对于同一个符号可以两种方式使用的情况,表D.1将操作符标记为一元组或二元组。
下面介绍一些优先级和结合性的例子。
对于下面的例子,编译器必须决定先将5和3相加,还是先将5和6相乘:
3 + 5*6
*操作符的优先级比+操作符高,所以它被首先用于5,因此表达式变成3+30,即33。
对于下面的例子,编译器必须决定先将120除以6,还是先将6和5相乘:
120/6*5
/和的优先级相同,但这些操作符从左到右结合的。这意味着首先应用操作数(6)左侧的操作符,因此表达式变为205,即100。
对于下面的例子,编译器必须决定先对str递增还是先对str解除引用:
后缀++操作符的优先级比一元操作符高,这意味着加号操作符将对str进行操作,而不是对str进行操作。也就是说,将指针加1,使之指向下一个字符,而不是修改被指针指向的字符。不过,由于++是后缀形式,因此在将*str的值赋给ch后,再将指针加1。因此,上述表达式将字符W赋给ch,然后移动指针str,使之指向字符h。
下面是一个类似的例子:
前缀++操作符和一元操作符的优先级相同,但它们是从右到左结合的。因此,str(不是str)将被加1。因为++操作符是前缀形式,所以首先将str加1,然后将得到的指针执行解除引用的操作。因此,str将指向字符h,并将字符h赋给ch。
注意,表D.1在“优先级”行中使用一元或二元来区分使用同一个符号的两个操作符,例如一元地址操作符和二元按位AND操作符。
表D.1 C++操作符的优先级和结合性