面试题:运算符优先级
来源:互联网 发布:吉力贝怪味糖 知乎 编辑:程序博客网 时间:2024/06/05 16:05
#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取反右移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
- 面试题:运算符优先级
- 有关运算符优先级的一道面试题
- 关于运算符优先级的一个面试题
- 【我解C语言面试题系列】007 运算符优先级问题
- 一个面试题,关于运算优先级和递增递减
- Erlang面试题:运算符
- 赋值运算符面试题
- 前端一道面试题,考察变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级
- 面试题1 赋值运算符函数
- 面试题1:赋值运算符函数
- 面试题(一) 赋值运算符
- 面试题1:赋值运算符函数
- 面试题1:赋值运算符函数
- 面试题1:赋值运算符函数
- 面试题1:赋值运算符函数
- 面试题1:赋值运算符函数
- java面试题三 位运算符
- 面试题1:赋值运算符函数
- 南阳理工ACM-题目2-括号配对问题
- cp命令复制时,保持路径不变
- java--有关前台展示图片流的用法
- windbg 学习笔记 FOR 内核调试(三) --进程句柄表HANDLE_TABLE
- hbase 写操作参数优化
- 面试题:运算符优先级
- Hibernate : Pre Database Opertaion Event Listeners
- 五大常用算法之一:分治算法
- OpenCV cvDFT 傅里叶变换
- 五大常用算法之二:动态规划算法
- 排列平方数
- iOS ARC相关
- 显示Intent与隐式Intent
- 五大常用算法之三:贪心算法