[C/C++]中按位“与”“或”“异或”的优先级比“==”低

项目调试时发现一个小问题,由于优先级没有搞对,导致的Bug。关于运算符优先级的问题以前学习的时候就没有太放在心上,因为一直觉得这个东西背了也没啥用,写程序的时候实在不行多加几个括号不就完事儿了吗。道理是不错的,这次就是少加了括号导致了一个常见的小Bug。记录一下,以后注意。

在C/C++中,if 语句简直是太常用了,if 语句中的条件判断为真的时候执行下面的语句(块),否则就不执行这些语句(块)。

又,C/C++中,宏定义也是个经常用的东西,特别是用来定义一些常量。

所以,经常能见到 if 语句的条件中会这么用:

#define SOME_MACRO 0x01
{
    Data d;
    
    if( d & SOME_MACRO == 0 )
    { do_something(); }
}

上面的例子中,我们的本意是判断 d 的第0位是不是0,如果是0就执行下面的一些操作。

但是由于“==”的优先级比按位与“&”、按位或“|”和按位异或“^”高,导致上面这样写之后程序并不能按我们想象的那样执行。首先编译器会计算SOME_MACRO==0是否为真(结果为false,0),然后计算d&0是否为真。结果一直都是0,所以这个 if 分支语句中的程序是永远不会被执行的。

所以,在写类似的程序的时候,一定要注意运算符的优先级,用括号将前面的按位与括起来。如下:

#define SOME_MACRO 0x01
{
    Data d;
    
    if( (d & SOME_MACRO) == 0 )//d第0位为0
    { do_something(); }
}

多说一句,左移(<<)和右移(>>)的优先级是比“==”高的。

最后,建议在写这些表达式的时候加上够多的括号,不要考验自己对优先级知识的熟练程度,将功能正确地实现才是第一位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值