Modern Clang Chapter-05
逻辑表达式
printf("%d,%d", 3 < 4, 3 > 4);
clang 没有布尔型, 但是比大小返回整型的1/0来对应真/假.
==
左结合, 优先级低于关系运算符, 结果返回 0/1 .
i<j == j<k
=> (i<j) == (j<k)
在 clang 中 0 == a
比 a == 0
的优势在于, 当误写为 0=a
编译会报错.
||
和 &&
短路计算.
if (sth) {
// 当 sth 非 0
} else {
// 当 sth 为 0, 整型的 0
}
int switch_case = 'a';
switch (switch_case) {
case 96:
printf("...");
break;
case 97:
case 98:
printf("!!!");
break;
default:
printf("***");
break;
}
clang 的 switch_case
只能是整型, 但是这里可以接收char, 把它看做整型.
每个 case
要主动 break , 不然会继续走后续的case. case 后只能是常量, 不能用表达式.
0 || -5
=> 1
1 || 1 && 0
=> 1 || (1 && 0)
1 || 1 < 0
=> 1 || (1 < 0)
运算符的运算顺序和子句的求值顺序无关:
f1() + f2() + f3()
会确保 (f1() + f2()) + f3()
, 但是并不确保 f1() 比 f3() 先求值.
c 运算符优先级
优先级 | 运算符 |
---|---|
1 | ++ 后缀 i++ — 后缀 i– () 函数调用 [] 数组下标 . 结构体 -> 结构体 (type){list} 符合字面量 |
2 | ++ 前缀 ++i — 前缀 —i ! 非 ~ 逐位非 (type) 类型转换 * 指针 & 取地址 sizeof 取大小 _Alignof 对齐要求 |
3 | * / % |
4 | + - |
5 | « 逐位左移 » 逐位右移 |
6 | «br /><= > >= |
7 | == != |
8 | & 逐位与 |
9 | ^ 逐位异或 |
10 | | 逐位或 |
11 | && 逻辑与 |
12 | || 逻辑或 |
13 | ?: 三目 |
14 | = += -= *= /= %= «= »= &= ^= = |
15 | , 逗号 |
乘除 > 加减 > 大小 > 等于 > 逻辑 > 赋值