C 语言运算符大全:算术、关系、逻辑、位运算、赋值与优先级详解
运算符是告诉编译器执行特定数学或逻辑运算的符号。C 语言内置运算符丰富,提供下列类型:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
本章逐一讲解各运算符工作方式。
算术运算符
下表列出 C 语言支持的所有算术运算符。假设变量 A 为 10,变量 B 为 20:
显示示例
| 运算符 | 描述 | 示例 |
|---|---|---|
| + | 两操作数相加 | A + B = 30 |
| - | 第一操作数减第二操作数 | A - B = -10 |
| * | 两操作数相乘 | A * B = 200 |
| / | 分子除以分母 | B / A = 2 |
| % | 取模运算符,整数除法后余数 | B % A = 0 |
| ++ | 自增运算符,整数值加 1 | A++ = 11 |
| -- | 自减运算符,整数值减 1 | A-- = 9 |
关系运算符
下表列出 C 支持的所有关系运算符。假设变量 A 为 10,变量 B 为 20:
显示示例
| 运算符 | 描述 | 示例 |
|---|---|---|
| == | 检查两操作数值是否相等。相等则条件为真。 | (A == B) 不为真。 |
| != | 检查两操作数值是否相等。不等则条件为真。 | (A != B) 为真。 |
| > | 检查左操作数是否大于右操作数。是则条件为真。 | (A > B) 不为真。 |
| < | 检查左操作数是否小于右操作数。是则条件为真。 | (A < B) 为真。 |
| >= | 检查左操作数是否大于等于右操作数。是则条件为真。 | (A >= B) 不为真。 |
| <= | 检查左操作数是否小于等于右操作数。是则条件为真。 | (A <= B) 为真。 |
逻辑运算符
下表列出 C 语言支持的所有逻辑运算符。假设变量 A 为 1,变量 B 为 0:
显示示例
| 运算符 | 描述 | 示例 |
|---|---|---|
| && | 逻辑与运算符。两操作数均非零则条件为真。 | (A && B) 为假。 |
| || | 逻辑或运算符。任一操作数非零则条件为真。 | (A || B) 为真。 |
| ! | 逻辑非运算符。反转操作数逻辑状态。条件为真则逻辑非使其为假。 | !(A && B) 为真。 |
位运算符
位运算符作用于位,执行逐位操作。&、|、^ 真值表如下:
| p | q | p & q | p | q | p ^ q |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 |
假设 A = 60,B = 13,二进制格式如下:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
下表列出 C 支持的位运算符。假设变量 'A' 为 60,变量 'B' 为 13:
显示示例
| 运算符 | 描述 | 示例 |
|---|---|---|
| & | 二进制与运算符,若位在两操作数中存在则复制到结果。 | (A & B) = 12, 即 0000 1100 |
| | | 二进制或运算符,若位在任一操作数存在则复制。 | (A | B) = 61, 即 0011 1101 |
| ^ | 二进制异或运算符,若位在一操作数设置但不在两者中则复制。 | (A ^ B) = 49, 即 0011 0001 |
| ~ | 二进制取反运算符,一元运算符,效果为“翻转”位。 | (~A ) = ~(60), 即 -0111101 |
| << | 二进制左移运算符。左操作数值左移右操作数指定位数。 | A << 2 = 240 即 1111 0000 |
| >> | 二进制右移运算符。左操作数值右移右操作数指定位数。 | A >> 2 = 15 即 0000 1111 |
赋值运算符
下表列出 C 语言支持的赋值运算符:
显示示例
| 运算符 | 描述 | 示例 |
|---|---|---|
| = | 简单赋值运算符。将右侧操作数值赋给左侧操作数 | C = A + B 将 A + B 的值赋给 C |
| += | 加后赋值运算符。右操作数加到左操作数并将结果赋给左操作数。 | C += A 等价于 C = C + A |
| -= | 减后赋值运算符。左操作数减右操作数并将结果赋给左操作数。 | C -= A 等价于 C = C - A |
| *= | 乘后赋值运算符。右操作数乘左操作数并将结果赋给左操作数。 | C *= A 等价于 C = C * A |
| /= | 除后赋值运算符。左操作数除右操作数并将结果赋给左操作数。 | C /= A 等价于 C = C / A |
| %= | 取模后赋值运算符。用两操作数取模并将结果赋给左操作数。 | C %= A 等价于 C = C % A |
| <<= | 左移后赋值运算符。 | C <<= 2 等同于 C = C << 2 |
| >>= | 右移后赋值运算符。 | C >>= 2 等同于 C = C >> 2 |
| &= | 按位与赋值运算符。 | C &= 2 等同于 C = C & 2 |
| ^= | 按位异或赋值运算符。 | C ^= 2 等同于 C = C ^ 2 |
| |= | 按位或赋值运算符。 | C |= 2 等同于 C = C | 2 |
杂项运算符:sizeof & 三元运算符
除上述运算符外,C 语言还支持 sizeof 和 ? : 等重要运算符。
显示示例
| 运算符 | 描述 | 示例 |
|---|---|---|
| sizeof() | 返回变量大小。 | sizeof(a),a 为整型,返回 4。 |
| & | 返回变量地址。 | &a; 返回变量实际地址。 |
| * | 指向变量的指针。 | *a; |
| ? : | 条件表达式。 | 若 Condition 为真 ? 则值 X : 否则值 Y |
C 语言运算符优先级
运算符优先级决定表达式中项的分组,决定表达式求值方式。某些运算符优先级高于其他;如乘法运算符优先级高于加法。
例如 x = 7 + 3 * 2;x 被赋值 13 而非 20,因 * 优先级高于 +,先计算 3*2 再加 7。
下表顶部优先级最高,底部最低。表达式中高优先级运算符优先求值。
显示示例
| 类别 | 运算符 | 结合性 |
|---|---|---|
| 后缀 | () [] -> . ++ - - | 左到右 |
| 一元 | + - ! ~ ++ - - (type)* & sizeof | 右到左 |
| 乘性 | * / % | 左到右 |
| 加性 | + - | 左到右 |
| 移位 | << >> | 左到右 |
| 关系 | < <= > >= | 左到右 |
| 相等 | == != | 左到右 |
| 按位与 | & | 左到右 |
| 按位异或 | ^ | 左到右 |
| 按位或 | | | 左到右 |
| 逻辑与 | && | 左到右 |
| 逻辑或 | || | 左到右 |
| 条件 | ?: | 右到左 |
| 赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 右到左 |
| 逗号 | , | 左到右 |
C语言