C/CPP运算优先级的坑及解决
作者:_不会dp不改名_
这篇文章主要介绍了C/CPP运算优先级的坑及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
C/CPP运算优先级坑
1. 位运算优先级低于比较运算符
做leetcode时遇到的,判断一个数某一比特位是否为0。
if ( val & 2 == 0) { // do someting... }
万万没想到&
运算符的优先级是低于==
的,debug了好久,得加上括号。
1.1 验证
#include <iostream> int main( int argc, char *argv[]){ int val = 2; if ( val & 1 == 0) { std::cout << "without (): bit 1 is 0" << std::endl; } else { std::cout << "without (): bit 1 is 1" << std::endl; } if ( (val & 1) == 0) { std::cout << "with (): bit 1 is 0" << std::endl; } else { std::cout << "with (): bit 1 is 0" << std::endl; } return 0; }
输出结果为
without (): bit 1 is 1
with (): bit 1 is 0
2. 移位运算符优先级低于算术运算符
这是在写二分的时候遇到的, l + (r-l) >> 1
的值永远为r >> 1
应该写作l + (r - l >> 2)
。
2.1 验证
#include <iostream> int main( int argc, char *argv[]){ int l = 2, r = 8; int mid = l + (r - l) >> 1; int mid2 = l + ( r - l >> 1); std::cout << "mid: " << mid << std::endl; std::cout << "mid2: " << mid2 << std::endl; return 0; }
输出结果为
mid: 4
mid2: 5
C语言运算优先级口诀
C语言常用运算符的优先级口诀是:“单算关逻条赋逗”;
如果加入位运算符,完整口诀是:“单算移关与,异或逻条赋”。
- “单”表示单目运算符:逻辑非(!),按位取反(~),自增(++),自减(--),取地址(&),取值(*);
- “算”表示算术运算符:乘、除和求余(*,/,%)级别高于加减(+,-);
- “移”表示按位左移(<<)和位右移(>>);
- “关”表示关系运算符:大小关系(>,>=,<,<=)级别高于相等不相等关系(==,!=);
- “与”表示按位与(&);
- “异”表示按位异或(^);
- “或”表示按位或(|);
- “逻”表示逻辑运算符:逻辑与(&&)级别高于逻辑或(||);
- “条”表示条件运算符(? :);
- “赋”表示赋值运算符(=,+=,-=,*=,/=,%=,>>=,<<=,&=,^=, |=,!=);
另,逗号运算符(,) 级别最低,口诀中没有表述,需另加记忆..
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。