面试题:运算符优先级

#include <iostream>
using namespace std;

int main(){
    unsigned char a=0xA5;
    unsigned char b=~a>>4+1;
    printf("%d\n",b);
    return 0;
}

首先是运算符优先级:=、~、>>和+优先级顺序是怎样的
运算符优先级和口诀:

一共有十五个优先级:

1 () [] . ->

2 ! ~ -(负号) ++ – &(取变量地址)* (type)(强制类型) sizeof

3 * / %

4 + -

5 >> <<

6 > >= < <=

7 == !=

8 &

9 ^

10 |

11 &&

12 ||

13 ?:

14 = += -= *= /= %= |= ^= &= >>= <<=

15 ,

结合性:2 13 14 是从右至左 其他都是 从左至右

口诀:
括号成员第 ; //括号运算符 成员运算符. ->

全体单目第 二` //所有的单目运算符比如++、 –、 +(正)、 -(负) 、指针运算*、&

乘除余 ,加减 ; //这个”余”是指取余运算即%

移位 ,关系 ; //移位运算符:<< >> ,关系:> < >= <= 等

等于(与)不等排第 ; //即== 和!=

位与异或和位或; //这几个都是位运算: 位与(&)异或(^)位或(|)

“三分天下”<font color="#4590a3" size = "4px">八九十</font>;

逻辑或跟与; //逻辑运算符:|| 和 &&

十二十一; //注意顺序:优先级(||) 底于 优先级(&&)

条件高于赋值, //三目运算符优先级排到 [十三] 位只比赋值 [十四]运算符和”,”[ 十五]高

逗号运算级最低! //逗号运算符优先级最低

所以优先级顺序是:~、+大于>>大于=,先做a的取反操作,然后4+1为5,然后~a>>5,然后赋值给b
下面,如果按照我们的常识,a取反右移5位应该是2才对,但是答案是250,对250分析可知,当~a右移时,前面补的是1,而不是0,为什么呢?

因为,无论是unsigned char,还是unsigned short、short、char等,都是转换成int来处理的,一般情况下,int为32位,所以a取反后是ffffff5a,右移5位,前面补1(最高位为1,在计算机中认为是负数,补1,如果是unsigned int型的变量的话,前面补0),最后转化成unsigned char型,所以取后8位是fa,即250

可以用以下程序测试:

#include <iostream>
using namespace std;

int main(){
    unsigned char a=0xA5;
    printf("%08x\n",a);
    printf("%08x\n",~a);
    unsigned int b=~a>>5;
    printf("%08x\n",b);
    return 0;
}
#include <iostream>
using namespace std;

int main(){
    unsigned int a=0xA5;
    printf("%08x\n",a);
    printf("%08x\n",~a);
    unsigned int b=~a>>5;
    printf("%08x\n",b);
    return 0;
}

两者输出的b截然不同,第一个输出为fffffffa,第二个为07fffffa

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值