首页 > 其他 > 详细

面试题:运算符优先级

时间:2014-02-27 01:48:29      阅读:533      评论:0      收藏:0      [点我收藏+]

#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  是从右至左   其他都是  从左至右

口诀:
括号成员第一;        //括号运算符[]() 成员运算符.  ->

全体单目第二;        //所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&乘除余三,加减四;   //这个"余"是指取余运算即%

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

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

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

"三分天下"八九十;  

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

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

条件高于赋值,        //三目运算符优先级排到13 位只比赋值运算符和","高

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


所以优先级顺序是:~、+大于>>大于=,先做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




面试题:运算符优先级,布布扣,bubuko.com

面试题:运算符优先级

原文:http://blog.csdn.net/starcuan/article/details/19926149

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!