符号优先级
C 语言所有运算符,按优先级从高到低排列(同一级别结合性相同):
| 优先级 | 运算符 | 说明 | 结合性 |
|---|---|---|---|
| 1(最高) | () | 函数调用 | 左→右 |
[] | 数组下标 | 左→右 | |
. | 成员访问 | 左→右 | |
-> | 指针成员访问 | 左→右 | |
++ -- | 后缀自增/自减 | 左→右 | |
| 2 | ++ -- | 前缀自增/自减 | 右→左 |
+ - | 单目正/负 | 右→左 | |
! | 逻辑非 | 右→左 | |
~ | 按位取反 | 右→左 | |
* | 解引用 | 右→左 | |
& | 取地址 | 右→左 | |
sizeof | 取大小 | 右→左 | |
(type) | 强制类型转换 | 右→左 | |
| 3 | * / % | 乘、除、取余 | 左→右 |
| 4 | + - | 加、减 | 左→右 |
| 5 | << >> | 位左移、位右移 | 左→右 |
| 6 | < <= > >= | 关系比较 | 左→右 |
| 7 | == != | 相等、不等 | 左→右 |
| 8 | & | 按位与 | 左→右 |
| 9 | ^ | 按位异或 | 左→右 |
| 10 | | | 按位或 | 左→右 |
| 11 | && | 逻辑与 | 左→右 |
| 12 | || | 逻辑或 | 左→右 |
| 13 | ?: | 三目条件 | 右→左 |
| 14 | = += -= *= /= %= &= ^= |= <<= >>= | 赋值 | 右→左 |
| 15(最低) | , | 逗号 | 左→右 |
在声明中只看第 1、2 级:
()[]优先级高于*,想让*先结合必须加括号。
float *fg(); // ()先结合 → fg 是函数,返回 float*
float (*fg)(); // 括号强制 * 先 → fg 是指向函数的指针
int *a[]; // []先结合 → a 是数组,元素是 int*
int (*a)[]; // 括号强制 * 先 → a 是指向数组的指针