9.运算符的优先级
@1.运算符的优先级表
优先级 运算符 名称或含义 结合方向
1 [] 数组下标 从左到右
() 圆括号
. 成员选择(对象)
-> 成员选择(指针)
2 - 负号运算符 从右到左
(类型) 强制类型转换
++ 自增运算符
-- 自减运算符
* 取值运算符
& 取地址运算符
! 逻辑非运算符
~ 按位取反运算符
sizeof 长度运算符
3 / 除 从左到右
* 乘
% 余数(取模)
4 + 加 从左到右
- 减
5 << 左移 从左到右
>> 右移
6 > 大于 从左到右
>= 大于等于
< 小于
<= 小于等于
7 == 等于 从左到右
!= 不等于
8 & 按位与 从左到右
9 ^ 按位异或 从左到右
10 | 按位或 从左到右
11 && 逻辑与 从左到右
12 || 逻辑或 从左到右
13 ?: 条件运算符 从右到左
14 = 赋值运算符 从右到左
/= 除后赋值
*= 乘后赋值
%= 取模后赋值
+= 加后赋值
-= 减后赋值
<<= 左移后赋值
>>= 右移后赋值
&= 按位与后赋值
^= 按位异或后赋值
|= 按位或后赋值
15 , 逗号运算符 从左到右
表达式 : *p.f
经常误认为的结果:p所指的字段f(*p).f
实际结果 :
2. 优先级问题: []高于*数组
表达式 : int * ap[]
经常误认为的结果:ap是个指向int数的指针 int (* ap)[]
实际结果 :
3. 优先级问题: 函数()高于*
表达式 : int *fp()
经常误认为的结果:fp是个函数指针,fp是个函数,返回int int (*fp)()
实际结果 :
4. 优先级问题: ==和!=高于位操作
表达式 : (val & mask !=0)
经常误认为的结果:(val & mask)!=0
实际结果 :val & (mask !=0)
5. 优先级问题: ==和!=高于赋值符
表达式 :c=getchar()!=EOF
经常误认为的结果:(c=getchar())!=EOF
实际结果 :c = (getchar()!=EOF)
6. 优先级问题: 算术运算符高于位移运算符
表达式 : mab<<4+lsb
经常误认为的结果:(msb << 4)+lsb
实际结果 : msb <<(4+lsb)
7. 优先级问题: 逗号运算符在所有运算符中优先级最低
表达式 :i =1,2
经常误认为的结果: i = (1,2)
实际结果 :(i = 1),2
@1.运算符的优先级表
优先级 运算符 名称或含义 结合方向
1 [] 数组下标 从左到右
() 圆括号
. 成员选择(对象)
-> 成员选择(指针)
2 - 负号运算符 从右到左
(类型) 强制类型转换
++ 自增运算符
-- 自减运算符
* 取值运算符
& 取地址运算符
! 逻辑非运算符
~ 按位取反运算符
sizeof 长度运算符
3 / 除 从左到右
* 乘
% 余数(取模)
4 + 加 从左到右
- 减
5 << 左移 从左到右
>> 右移
6 > 大于 从左到右
>= 大于等于
< 小于
<= 小于等于
7 == 等于 从左到右
!= 不等于
8 & 按位与 从左到右
9 ^ 按位异或 从左到右
10 | 按位或 从左到右
11 && 逻辑与 从左到右
12 || 逻辑或 从左到右
13 ?: 条件运算符 从右到左
14 = 赋值运算符 从右到左
/= 除后赋值
*= 乘后赋值
%= 取模后赋值
+= 加后赋值
-= 减后赋值
<<= 左移后赋值
>>= 右移后赋值
&= 按位与后赋值
^= 按位异或后赋值
|= 按位或后赋值
15 , 逗号运算符 从左到右
@2.一些容易出错的优先级问题
表达式 : *p.f
经常误认为的结果:p所指的字段f(*p).f
实际结果 :
2. 优先级问题: []高于*数组
表达式 : int * ap[]
经常误认为的结果:ap是个指向int数的指针 int (* ap)[]
实际结果 :
3. 优先级问题: 函数()高于*
表达式 : int *fp()
经常误认为的结果:fp是个函数指针,fp是个函数,返回int int (*fp)()
实际结果 :
4. 优先级问题: ==和!=高于位操作
表达式 : (val & mask !=0)
经常误认为的结果:(val & mask)!=0
实际结果 :val & (mask !=0)
5. 优先级问题: ==和!=高于赋值符
表达式 :c=getchar()!=EOF
经常误认为的结果:(c=getchar())!=EOF
实际结果 :c = (getchar()!=EOF)
6. 优先级问题: 算术运算符高于位移运算符
表达式 : mab<<4+lsb
经常误认为的结果:(msb << 4)+lsb
实际结果 : msb <<(4+lsb)
7. 优先级问题: 逗号运算符在所有运算符中优先级最低
表达式 :i =1,2
经常误认为的结果: i = (1,2)
实际结果 :(i = 1),2