项目调试时发现一个小问题,由于优先级没有搞对,导致的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(); }
}
多说一句,左移(<<)和右移(>>)的优先级是比“==”高的。
最后,建议在写这些表达式的时候加上够多的括号,不要考验自己对优先级知识的熟练程度,将功能正确地实现才是第一位。