优先级 |
运算符 |
名称或含义 |
使用形式 |
结合方向 |
说明 |
1 |
[] |
数组下标 |
数组名[常量表达式] |
左到右 | |
() |
圆括号 |
(表达式)/函数名(形参表) | |||
. |
成员选择(对象) |
对象.成员名 | |||
-> |
成员选择(指针) |
对象指针->成员名 | |||
2 |
- |
负号运算符 |
-表达式 |
右到左 |
单目运算符 |
(类型) |
强制类型转换 |
(数据类型)表达式 | |||
++ |
自增运算符 |
++变量名/变量名++ |
单目运算符 | ||
-- |
自减运算符 |
--变量名/变量名-- |
单目运算符 | ||
* |
取值运算符 |
*指针变量 |
单目运算符 | ||
& |
取地址运算符 |
&变量名 |
单目运算符 | ||
! |
逻辑非运算符 |
!表达式 |
单目运算符 | ||
~ |
按位取反运算符 |
~表达式 |
单目运算符 | ||
sizeof |
长度运算符 |
sizeof(表达式) | |||
3 |
/ |
除 |
表达式/表达式 |
左到右 |
双目运算符 |
* |
乘 |
表达式*表达式 |
双目运算符 | ||
% |
余数(取模) |
整型表达式/整型表达式 |
双目运算符 | ||
4 |
+ |
加 |
表达式+表达式 |
左到右 |
双目运算符 |
- |
减 |
表达式-表达式 |
双目运算符 | ||
5 |
<< |
左移 |
变量<<表达式 |
左到右 |
双目运算符 |
>> |
右移 |
变量>>表达式 |
双目运算符 | ||
6 |
> |
大于 |
表达式>表达式 |
左到右 |
双目运算符 |
>= |
大于等于 |
表达式>=表达式 |
双目运算符 | ||
< |
小于 |
表达式<表达式 |
双目运算符 | ||
<= |
小于等于 |
表达式<=表达式 |
双目运算符 | ||
7 |
== |
等于 |
表达式==表达式 |
左到右 |
双目运算符 |
!= |
不等于 |
表达式!= 表达式 |
双目运算符 | ||
8 |
& |
按位与 |
表达式&表达式 |
左到右 |
双目运算符 |
9 |
^ |
按位异或 |
表达式^表达式 |
左到右 |
双目运算符 |
10 |
| |
按位或 |
表达式|表达式 |
左到右 |
双目运算符 |
11 |
&& |
逻辑与 |
表达式&&表达式 |
左到右 |
双目运算符 |
12 |
|| |
逻辑或 |
表达式||表达式 |
左到右 |
双目运算符 |
13 |
?: |
条件运算符 |
表达式1? 表达式2: 表达式3 |
右到左 |
三目运算符 |
14 |
= |
赋值运算符 |
变量=表达式 |
右到左 | |
/= |
除后赋值 |
变量/=表达式 | |||
*= |
乘后赋值 |
变量*=表达式 | |||
%= |
取模后赋值 |
变量%=表达式 | |||
+= |
加后赋值 |
变量+=表达式 | |||
-= |
减后赋值 |
变量-=表达式 | |||
<<= |
左移后赋值 |
变量<<=表达式 | |||
>>= |
右移后赋值 |
变量>>=表达式 | |||
&= |
按位与后赋值 |
变量&=表达式 | |||
^= |
按位异或后赋值 |
变量^=表达式 | |||
|= |
按位或后赋值 |
变量|=表达式 | |||
15 |
, |
逗号运算符 |
表达式,表达式,… |
左到右 |
从左向右顺序运算 |
乍一看,真的狠难记住。但是记优先级我们是有一定技巧的。
第一,优先级最高的是不加入运算的这些运算符,
[]数组下标 ()圆括号 .对象成员选择 ->指针的成员选择
第二,接着是单目运算符,指的是参加运算符运算的对象只有一个,如 !,~,++,--,+(正),-(负),*,&, (type)强制类型转换,sizeof
第三, 是双目运算符,指的是参加运算符运算的对象必须是两个。例如+,-,*,、,%,+=,&,&&等
双目运算符中算术运算符优先级最高
双目运算符中除了算术运算符之外,其他运算符的优先级是最难的。
最主要也是最难记的部分就是双目和三目运算符这里。
现将这些运算符分一下类:
移位运算符::<<, >>
关系运算符:> , < ,>= ,<=、==、!=
逻辑运算符:&、^、|、&&、||(&^|三个并非真正的逻辑运算符)
条件运算符:?:
赋值运算符:=、+=、-=、/=、*=、^=、%=、&=、|=、<<=、>>=
网上看到一个挺有意思的记忆法:
以官场升迁为例。比如甲想要升官(即移位),那么就必须找关系吧(即关系),找关系也要有逻辑啊,不能随便找,(即逻辑),找到了关系,也要满足一定的条件才能升迁,比如年限啥的(即条件),一切ok之后就可以上任了。(即赋值)。
所以可以归纳为:
想要(移位)->得找(关系)->合乎(逻辑)->符合(条件)->赋值岗位。
还要补充说明两点:
第一:关系运算符中,==、!=优先级要低于其他关系运算符,两者之间相同
第二:逻辑运算符中的,&、^、|、&&、||优先级从左到右一次降低
第四条规则:逗号运算符优先级最低,所有单目运算符(包括三目)从右到左,所有双目运算符从左到右。
除了上述四条规则之外,还必须说明一点,标准的c语言编译器对运算符的解析遵循“最大贪婪原则”。
所谓的最大贪婪原则指的是:当c语言编译器对源程序进行词法分析时,如果运算符的下一个符号还是运算符,并且能和前一个运算符构成一个新的合法运算符的时候,编译器的词法分析器必须将其解析为两个运算符构成的新的运算符。
例如:x=z+++y;
应该是按照x=(z++)+y来计算