C/C++中操作符的优先级和求值顺序

今天在看《The C Puzzle Book》时,又看到了从一开始学C语言就一直被反复强调的问题:操作符优先级和求值顺序。也许平时大家都不太注意这个问题——的确,当不清楚优先级关系 时,可以直接使用圆括号来”手动“决定优先顺序——所以优先级通常都不会引起大家的注意。然而,在《The C Puzzle Book》中,几个非常巧妙的例子却说明了,如果能让优先级顺序了然于心,那么便能够写出很简洁很漂亮的代码。
1:int x;    x = - 3 * 4 % - 6 / 5;    —— x = (((-3) * 4) % (-6)) / 5;
      因为“*”和“%”和“/”的优先级是一样的,且结合顺序是自左向右。
2:int x = 2, y = 1, z = 0;    z += - x ++ + ++ y;    —— z += (-(x++)) + (++y);
      因为“++”和“--”的优先级要高于负号(“++”和“--”只对左值有效)。
3:int x = 1, y = 1, z = 1;    z += x < y ? x ++ : y ++;    —— z += (x < y ? (x++) : (y++));
      因为“+=”的优先级仅高于“,”。
4:int x = 3, y = 4, z = 4;    (z >= y > = x) ? 1 : 0;    —— ((z >= y) > = x) ? 1 : 0;
      因为“>=”的结合顺序是自左向右。
5:int x = 1, y = 1, z = 1;    ++x || ++y && ++z;    —— ++x || (++y && ++z);
      因为“++x”始终为真,由于“||”的短路,后面的表达式将不被计算。所以只有x变成了2。

附上操作符优先级表,便于以后查阅:

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

 

()

圆括号

(表达式)/函数名(形参表)

 

.

成员选择(对象)

对象.成员名

 

->

成员选择(指针)

对象指针->成员名

 

2

-

负号运算符

-表达式

右到左

单目运算符

(类型)

强制类型转换

(数据类型)表达式

 

++

自增运算符

++变量名/变量名++

单目运算符

--

自减运算符

--变量名/变量名--

单目运算符

*

取值运算符

*指针变量

单目运算符

&

取地址运算符

&变量名

单目运算符

!

逻辑非运算符

!表达式

单目运算符

~

按位取反运算符

~表达式

单目运算符

sizeof

长度运算符

sizeof(表达式)

 

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

双目运算符

%

余数(取模)

整型表达式/整型表达式

双目运算符

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

双目运算符

5

<<

左移

变量<<表达式

左到右

双目运算符

>>

右移

变量>>表达式

双目运算符

6

>

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

双目运算符

<

小于

表达式<表达式

双目运算符

<=

小于等于

表达式<=表达式

双目运算符

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

双目运算符

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

表达式1? 表达式2: 表达式3

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

 

/=

除后赋值

变量/=表达式

 

*=

乘后赋值

变量*=表达式

 

%=

取模后赋值

变量%=表达式

 

+=

加后赋值

变量+=表达式

 

-=

减后赋值

变量-=表达式

 

<<=

左移后赋值

变量<<=表达式

 

>>=

右移后赋值

变量>>=表达式

 

&=

按位与后赋值

变量&=表达式

 

^=

按位异或后赋值

变量^=表达式

 

|=

按位或后赋值

变量|=表达式

 

15

,

逗号运算符

表达式,表达式,…

左到右

从左向右顺序运算



你可能感兴趣的:(C&C++)