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 | , 逗号 |
乘除 > 加减 > 大小 > 等于 > 逻辑 > 赋值