判断语句中位运算符的一个小坑
最近训练时敲代码总爱在 if 语句中有位算符时踩坑, 比如 if(i&1==0)
或 if(i&i-1 == 0)
,本意是想判 i 是否为偶数和 i 是否为 2 的幂,但这么写都是错误的,导致程序不能输出正确结果。每次 debug 时又不明所以,耗了很长时间才找到。在这里记录下。
错误的原因是 ==
运算符优先级要高于 &
|
^
这三个位运算符,故导致上面代码的判断顺序实际为 if(i & (1==0))
和 if(i & (i-1 == 0))
。 很痛苦呀,有没有。
建议:
- 判断式中如果同时存在位运算符和小于等于大于时,将位运算符表达式加上括号
- 判等时,如果一边是常数一边是变量,将常数放于判等左边。 (TAT,当时听郝斌老师讲这条时还不以为意,心想判等自己肯定不会写成 = , 现在想来,真是内牛满面呀,这条规则实在太好了)