如题:
#define NUM_1 0x01<<3
#define NUM_2 0x01<<4
unsigned char flag = 0;
void test()
{
flag |= NUM_1;
flag &= ~NUM_2;
}
//flag运行之后的数值是多少?
一般函数体的这两句用来置1和清零操作,那么flag在运行之后数值是多少?
如果你的答案是0x08,请你耐心看下去。
define的含义:define是进行预编译,其实预编译所执行的操作就是简单的“文本”替换,所以在编译运行过程中,test()函数体内函数展开为:
void test()
{
flag |= 0x01<<3;
flag &= ~0x01<<4;
}
看到这里,我们需要清楚各运算符的优先级问题,这几个运算符中“~”的优先级最高,其次分别是“<<”、"&="、"|="。所以安札奥这个思路,正确的答案是flag=0,大家可以运行一下去尝试,这也就是要在define后带运算符的算式需要加"()"的必要性。正确的书写方式为:
#define NUM_1 (0x01<<3)
#define NUM_2 (0x01<<4)
unsigned char flag = 0;
void test()
{
flag |= NUM_1;
flag &= ~NUM_2;
}
此时,也就得到我们想要的运行结果0x08了。
由于博主之前在写驱动的时候在这方面碰过钉子,所以分享给大家,讲清楚其中的原理,避免大家碰到同样的麻烦。