关于为何写驱动代码时#define后常常需要加括号“()”

如题:

#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了。

由于博主之前在写驱动的时候在这方面碰过钉子,所以分享给大家,讲清楚其中的原理,避免大家碰到同样的麻烦。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你K哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值