逻辑表达式

printf("%d,%d", 3 < 4, 3 > 4);

clang 没有布尔型, 但是比大小返回整型的1/0来对应真/假.

== 左结合, 优先级低于关系运算符, 结果返回 0/1 .

i<j == j<k => (i<j) == (j<k)

在 clang 中 0 == aa == 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 , 逗号

乘除 > 加减 > 大小 > 等于 > 逻辑 > 赋值