C语言优先级——取反和移位

遇到一个面试题:

unsigned char a=0xA5;
unsigned char b=~a>>4;

结果是245,提示的是先提升类型然后移位,然后取反,然后截断。

但是单目运算符的优先级高于移位运算符啊,难道因为~是自右向左结合的?

 

在VS2008中测试

unsigned char a=0xA5;
unsigned char b=~(a>>4);

结果b还是254?难道给做了处理?头疼!

 

C++中算术运算只能针对int类型,因此会有提升,提升了以后取反,高位的都是1了,移位以后高四位都是1,因此最后的结果是245,但是过程不是提示的那样子。

1:整值提升
0xA5 == 10100101 -> 00000000 00000000 00000000 10100101

2:取反
00000000 00000000 00000000 10100101 -> 11111111 11111111 11111111 01011010

3:右移
11111111 11111111 11111111 01011010 >> 4 == 11111111 11111111 11111111 11110101(算术移位) 或者 00001111 11111111 11111111 11110101(逻辑移位)

4:截断
b == 0xf5即245

 

运算符优先级:

-初等,4个: ( ) [ ] -> 指向结构体成员 . 结构体成员 
-单目,10个: !(逻辑取反) ~(位取反,位操作符) ++ -- -负号 +正号 (类型)   *指针 &取地址 sizeof长度 (结合方向:自右向左)
-算术,5个: * / % + - 
-位移,2个: << >>   (位操作符)
-关系,6个: < <= > >= == 等于 != 不等于 
-位逻,3个: & 按位与 ^ 按位异或 | 按位或  (位操作符)
-逻辑,2个: && 逻辑与 || 逻辑或 
-条件,1个,三目: ? :                                                         (结合方向:自右向左)
-赋值,11个: = += -= *= /= %= >>= <<= &= ^= |=         (结合方向:自右向左)
-逗号,1个: , 
结合方向自右向左的只有三类:赋值、单目和三目,其它的都是从左至右结合

 

C语言优先级

优先级运算符名称或含义使用形式结合方向说明符号性质
1[]数组下标数组名[整型表达式]左到右 初等(4个)
()圆括号(表达式)/函数名(形参表) 
.成员选择(对象)对象.成员名 
->成员选择(指针)对象指针->成员名 
2-负号运算符-算术类型表达式右到左单目运算符单目(10个)
+正号运算符+算术类型表达式单目运算符
(type)强制类型转换(纯量数据类型)纯量表达式 
++自增运算符++纯量类型可修改左值表达式单目运算符
--自减运算符--纯量类型可修改左值表达式单目运算符
*取值运算符*指针类型表达式单目运算符
&取地址运算符&表达式单目运算符
!逻辑非运算符!纯量类型表达式单目运算符
~按位取反运算符~整型表达式单目运算符
sizeof长度运算符

sizeof 表达式

sizeof(类型)

 
3/表达式/表达式左到右双目运算符算术(5个)
*表达式*表达式双目运算符
%余数(取模)整型表达式%整型表达式双目运算符
4+表达式+表达式左到右双目运算符
-表达式-表达式双目运算符
5<<左移整型表达式<<整型表达式左到右双目运算符位移(2个)
>>右移整型表达式>>整型表达式双目运算符
6>大于表达式>表达式左到右双目运算符关系(6个)
>=大于等于表达式>=表达式双目运算符
<小于表达式<表达式双目运算符
<=小于等于表达式<=表达式双目运算符
7==等于表达式==表达式左到右双目运算符
!=不等于表达式!= 表达式双目运算符
8&按位与整型表达式&整型表达式左到右双目运算符位逻(3个)
9^按位异或整型表达式^整型表达式左到右双目运算符
10|按位或整型表达式|整型表达式左到右双目运算符
11&&逻辑与表达式&&表达式左到右双目运算符逻辑(2个)
12||逻辑或表达式||表达式左到右双目运算符
13?:条件运算符表达式1? 表达式2: 表达式3右到左三目运算符条件(1个)
14=赋值运算符可修改左值表达式=表达式右到左 赋值(11个)
/=除后赋值可修改左值表达式/=表达式 
*=乘后赋值可修改左值表达式*=表达式 
%=取模后赋值可修改左值表达式%=表达式 
+=加后赋值可修改左值表达式+=表达式 
-=减后赋值可修改左值表达式-=表达式 
<<=左移后赋值可修改左值表达式<<=表达式 
>>=右移后赋值可修改左值表达式>>=表达式 
&=按位与后赋值可修改左值表达式&=表达式 
^=按位异或后赋值可修改左值表达式^=表达式 
|=按位或后赋值可修改左值表达式|=表达式 
15,逗号运算符表达式,表达式,…左到右从左向右顺序结合逗号(1个)

说明:

同一优先级的运算符,结合次序由结合方向所决定。

简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值