c/c++ 运算符 优先级 结合性 记录
c 和c++ 中大部分运算符的优先级和结合性是一致的,但c++中不但引入了一些新的运算符,还对c中的运算符进行了一些修改。需要特别注意。
1. &&优先级比 || 高
2. ++ -- 是整个表达式运算结束或开始前计算的。不只是一个运算符后。
int i=1,j;
j=i+++i+++i++; i=4,j=3;
int i=1,m;
m=++i+++i+++i; i=4,m=12;
3 a+++++b;
在c/c++语言中为了避免产生二义性,如果一个字符串能够解释为多个操作符,c/c++语言编译器将按照“构成操作符的字符个数越多越好”的原则来作出选择。根据这一原则 解释为 a++ ++ + b; 这就不是一个合法的表达式了。但只要加上空格 a++ + ++b;就合法了。
4.运算符的优先级和求值顺序
int x,y,z;
x=y=z=1;
++x || ++y && ++z;
结果为 x = 2,y=1,z=1.因为“||”操作符的左操作数是TRUE,所以没有必要继续求值了。事实上,c/c++语言肯定不会继续求值--按照c/c++语言里的有关规则,在按从左到右的顺序对一个逻辑表达式求值的时候,只要知道了他的实际结果,就不会再对其余部分求值。
C语言运算符优先级
|
优先级 |
运算符 |
名称或含义 |
使用形式 |
结合方向 |
说明 |
|
1 |
[] |
数组下标 |
数组名[常量表达式] |
左到右 |
-- |
|
() |
圆括号 |
(表达式)/函数名(形参表) |
-- |
||
|
. |
成员选择(对象) |
对象.成员名 |
-- |
||
|
-> |
成员选择(指针) |
对象指针->成员名 |
-- |
||
|
|
|||||
|
2 |
- |
负号运算符 |
-表达式 |
右到左 |
单目运算符 |
|
~ |
按位取反运算符 |
~表达式 |
|||
|
++ |
自增运算符 |
++变量名/变量名++ |
|||
|
-- |
自减运算符 |
--变量名/变量名-- |
|||
|
* |
取值运算符 |
*指针变量 |
|||
|
& |
取地址运算符 |
&变量名 |
|||
|
! |
逻辑非运算符 |
!表达式 |
|||
|
(类型) |
强制类型转换 |
(数据类型)表达式 |
-- |
||
|
sizeof |
长度运算符 |
sizeof(表达式) |
-- |
||
|
|
|||||
|
3 |
/ |
除 |
表达式/表达式 |
左到右 |
双目运算符 |
|
* |
乘 |
表达式*表达式 |
|||
|
% |
余数(取模) |
整型表达式%整型表达式 |
|||
|
4 |
+ |
加 |
表达式+表达式 |
左到右 |
双目运算符 |
|
- |
减 |
表达式-表达式 |
|||
|
5 |
<< |
左移 |
变量<<表达式 |
左到右 |
双目运算符 |
|
>> |
右移 |
变量>>表达式 |
|||
|
|
|||||
|
6 |
> |
大于 |
表达式>表达式 |
左到右 |
双目运算符 |
|
>= |
大于等于 |
表达式>=表达式 |
|||
|
< |
小于 |
表达式<表达式 |
|||
|
<= |
小于等于 |
表达式<=表达式 |
|||
|
7 |
== |
等于 |
表达式==表达式 |
左到右 |
双目运算符 |
|
!= |
不等于 |
表达式!= 表达式 |
|||
|
|
|||||
|
8 |
& |
按位与 |
表达式&表达式 |
左到右 |
双目运算符 |
|
9 |
^ |
按位异或 |
表达式^表达式 |
左到右 |
双目运算符 |
|
10 |
| |
按位或 |
表达式|表达式 |
左到右 |
双目运算符 |
|
11 |
&& |
逻辑与 |
表达式&&表达式 |
左到右 |
双目运算符 |
|
12 |
|| |
逻辑或 |
表达式||表达式 |
左到右 |
双目运算符 |
|
|
|||||
|
13 |
?: |
条件运算符 |
表达式1? 表达式2: 表达式3 |
右到左 |
三目运算符 |
|
|
|||||
|
14 |
= |
赋值运算符 |
变量=表达式 |
右到左 |
-- |
|
/= |
除后赋值 |
变量/=表达式 |
-- |
||
|
*= |
乘后赋值 |
变量*=表达式 |
-- |
||
|
%= |
取模后赋值 |
变量%=表达式 |
-- |
||
|
+= |
加后赋值 |
变量+=表达式 |
-- |
||
|
-= |
减后赋值 |
变量-=表达式 |
-- |
||
|
<<= |
左移后赋值 |
变量<<=表达式 |
-- |
||
|
>>= |
右移后赋值 |
变量>>=表达式 |
-- |
||
|
&= |
按位与后赋值 |
变量&=表达式 |
-- |
||
|
^= |
按位异或后赋值 |
变量^=表达式 |
-- |
||
|
|= |
按位或后赋值 |
变量|=表达式 |
-- |
||
|
|
|||||
|
15 |
, |
逗号运算符 |
表达式,表达式,… |
左到右 |
--
|

c++运算符优先级和结合性
| 优先级 | 运算符 | 说明 | 结合性 |
|---|---|---|---|
| 1 | :: | 范围解析 | 自左向右 |
| 2 | ++ -- | 后缀自增/后缀自减 | |
| () | 括号 | ||
| [] | 数组下标 | ||
| . | 成员选择(对象) | ||
| −> | 成员选择(指针) | ||
| 3 | ++ -- | 前缀自增/前缀自减 | 自右向左 |
| + − | 正/负号 | ||
| ! ~ | 逻辑非/按位取反 | ||
| (type) | 强制类型转换 | ||
| * | 取指针指向的值 | ||
| & | 某某的地址 | ||
| sizeof | 某某的大小 | ||
| new, new[] | 动态内存分配/动态数组内存分配 | ||
| delete, delete[] | 动态内存释放/动态数组内存释放 | ||
| 4 | .* ->* | 成员对象选择/成员指针选择 | 自左向右 |
| 5 | * / % | 乘法/除法/取余 | |
| 6 | + − | 加号/减号 | |
| 7 | << >> | 位左移/位右移 | |
| 8 | < <= | 小于/小于等于 | |
| > >= | 大于/大于等于 | ||
| 9 | == != | 等于/不等于 | |
| 10 | & | 按位与 | |
| 11 | ^ | 按位异或 | |
| 12 | | | 按位或 | |
| 13 | && | 与运算 | |
| 14 | || | 或运算 | |
| 15 | ?: | 三目运算符 | 自右向左 |
| 16 | = | 赋值 | |
| += −= | 相加后赋值/相减后赋值 | ||
| *= /= %= | 相乘后赋值/相除后赋值/取余后赋值 | ||
| <<= >>= | 位左移赋值/位右移赋值 | ||
| &= ^= |= | 位与运算后赋值/位异或运算后赋值/位或运算后赋值 | ||
| 17 | throw | 抛出异常 | |
| 18 | , | 逗号 | 自左向右 |

浙公网安备 33010602011771号