如果你是指“一个运算符的结合性会从自右至左变为自左至右吗?反过来会吗?”,那么答案是否定的。如果你是指“一个优先级较低的运算符会先于一个优先级较高的运算符被执行吗?”,那么答案是肯定的。表14.9按优先级从高到低的顺序列出了所有的运算符及其结合性:
表14.9运算符优先级
----------------------------------------------------------------
运算符 结合性
----------------------------------------------------------------
() [] -> 自左至右
! ~ ++ -- -(类型转换) * & 自右至左
sizeof * / % 自左至右
+ - 自左至右
<< >> 自左至右
<< = >>= 自左至右
== != 自左至右
& 自左至右
^ 自左至右
| 自左至右
&& 自左至右
|| 自左至右
?: 自右至左
= += -= 自右至左
, 自左至右
------------------------------------------------------------------
注意,运算符“!=”的优先级高于“=”(实际上,几乎所有的运算符的优先级都高于“=”)。下面两行语句说明了运算符优先级的差异是怎样给程序员带来麻烦的:
while(ch=getch()!=27)printf(”Got a character/n”);
while((ch=geteh())!=27)printf("Got a character/n");
显然,上述语句的目的是从键盘上接收一个字符,并与十进制值27(Escape键)进行比较。不幸的是,在第一条语句中,getch()与Escape键进行了比较,其比较结果(TRUE或FALSE)而不是从键盘上输入的字符被赋给了ch。这是因为运算符“!=”的优先级高于“=”。
在第二条语句中,表达式"ch=geteh()”的外边加上了括号。因为括号的优先级最高,所以来自键盘的字符先被赋给ch,然后再与Escape键进行比较,并把比较结果(TRUE或FALSE)返回给while语句,这才是程序真正的目的(当while的条件为TRUE时,打印相应的句子)。需要进一步提出的是,与27比较的并不是ch,而是表达式"ch—getch()”的结果。在这个例子中,这一点可能不会造成什么影响,但括号确实可以改变代码的组织方式和运行方式。当一个语句中有多个用括号括起来的表达式时,代码的执行顺序是从最里层的括号到最外层,同层的括号则从左到右执行。
注意,每个运算符在单独情况下的结合性(自左至右,或自右至左)都是不会改变的,但优先级的顺序可以改变。