算符优先级首先决定了,一些括号是可加可不加,还是必须加;
-
==
号的优先级要大于&、|、^
(位运算) 的优先级,所以如果判断一个数是否为偶数:if (x & 1 == 0) // if (x & (1 == 0)) // 是永远不会成立的
1. 注意
-
b & 1 == 0 ⇒ b & (1 == 0) ⇒ 0
- 显然不是期望的结果
- ==(!=,比较运算符) 的优先级要大于 & (|/^,位运算符)
-
移位运算符(>>/<< )大于比较运算符(> / < / ==)
cout << boolalpha << a == b << endl; // 是会报错的; cout << boolalpha << (a == b) << endl;
-
相等性比较运算
!= / ==
的优先级要高于赋值运算(=
)。
DIR *dp;
struct dirent *dirp;
if (dp = opendir(argv[1]) == NULL){
}
// 编译不通过
// opendir(argv[1]) == NULL,先结合
// 也即 dp = (opendir(argv[1]) == NULL)
// 将一个布尔变量,赋值给一个指针显然编译不通过。
操作符的优先级确定了结合律;
-
!=(不等号) 的优先级要大于 = (赋值运算符)
char key = ''; while (key = getchar() != 'q') { // key 只有两种取值为 0 或者为 1 switch(key) { case 'f': ... case 't': ... } }
所以,必要的时候,使用括号确定优先级:
while ((key=getchar()) != 'q') { ... }
-
+/-/*/\(加减乘除)的优先级要大于移位运算符(<<、>>)