下面想跟大家分享一下,请大家看下面一个例子,看看结果是什么?
#include <iostream>
using namespace std;
int main()
{
- unsigned char a = 0xA5;
-
unsigned char b = ~a>>4; (1)
-
unsigned char c = (~a)>>4;
-
unsigned char d = (unsigned char)~a>>4;
-
unsigned char e = ((unsigned char)(~a))>>4;
-
unsigned char f = (unsigned char)(~a>>4);
- printf("b = %d/n", b);
- printf("c = %d/n", c);
- printf("d = %d/n", d);
- printf("e = %d/n", e);
- printf("f = %d/n", f);
- return 0;
}
要考虑的问题是:
- 1、是否存在隐式类型转换?
2、~和<<运算符哪个优先级高?
那么现在通过对(1)进行分析,对以上2个问题进行解答:
- 1、虽然a是unsigned char, 计算这个表达式的时候编译器会先把a和4转换成int类型再计算,把结果转换成unsigned char赋值给b。
2、~的优先级高于>>。
因此,首先对a进行整数提升,于是~a编程了0xFFFFFF5A。然后对a右移4位,得到0x0FFFFFF5。最后转换成unsigned char赋值给b,所以结果是245。
依次类推,最后的结果是:
b = 245
c = 245
d = 5
e = 5
f = 245
怎么样,小小几行代码也暗藏很多玄机吧。