运算符(上)
运算符
C 语言有非常多的运算符(operator),有些可能你都没意识到属于运算符:
优先级 | 运算符 | 描述 | 结合性 |
---|---|---|---|
1 | ++ -- | 后缀自增与自减 | 从左到右 |
1 | () [] | 函数调用、数组下标 | 从左到右 |
1 | . -> | 成员访问 | 从左到右 |
1 | (type){list} | 复合字面量(C99) | 从左到右 |
2 | ++ -- | 前缀自增与自减 | 从右到左 |
2 | + - ! ~ | 正负号、逻辑非、逐位非 | 从右到左 |
2 | (type) | 强制类型转换 | 从右到左 |
2 | * & | 解引用、取地址 | 从右到左 |
2 | sizeof _Alignof | 取大小、对齐要求(C11) | 从右到左 |
3 | * / % | 乘法、除法、余数 | 从左到右 |
4 | + - | 加法、减法 | 从左到右 |
5 | << >> | 左移、右移 | 从左到右 |
6 | < <= > >= | 小于、小于等于、大于、大于等于 | 从左到右 |
7 | == != | 等于、不等于 | 从左到右 |
8 | & | 按位与 | 从左到右 |
9 | ^ | 按位异或 | 从左到右 |
10 | | | 按位或 | 从左到右 |
11 | && | 逻辑与 | 从左到右 |
12 | || | 逻辑或 | 从左到右 |
13 | ?: | 条件 | 从右到左 |
14 | = | 简单赋值 | 从右到左 |
14 | += -= *= /= %= | 算术运算复合赋值 | 从右到左 |
14 | <<= >>= &= ^= |= | 位运算复合赋值 | 从右到左 |
15 | , | 逗号 | 从左到右 |
优先级与结合性
运算符优先级和结合性是最常见的容易犯错的地方。在解析一个表达式的时候,优先级是首先应该考虑的因素。在优先级相同的情况下,我们再讨论结合性。
运算符的优先级大致可以这样记忆:后缀>前缀>乘除余>加减>位移>比较>位运算>条件>赋值>逗号。
至于结合性,是很容易误解的一个概念。我们日常生活中进行的运算都是左结合的,也就是从左到右计算。例如1 + 2 - 3