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 |
关系运算符
假设 A = 10,B = 20:
| 运算符 | 说明 | 示例 |
|---|---|---|
| == | 检查两操作数值是否相等 | (A == B) 为 false |
| != | 检查两操作数值是否不等 | (A != B) 为 true |
| > | 检查左操作数是否大于右操作数 | (A > B) 为 false |
| < | 检查左操作数是否小于右操作数 | (A < B) 为 true |
| >= | 检查左操作数是否大于等于右操作数 | (A >= B) 为 false |
| <= | 检查左操作数是否小于等于右操作数 | (A <= B) 为 true |
逻辑运算符
假设 A 为 true,B 为 false:
| 运算符 | 说明 | 示例 |
|---|---|---|
| && | 逻辑与:两操作数均非零则为真 | (A && B) 为 false |
| || | 逻辑或:任一操作数非零则为真 | (A || B) 为 true |
| ! | 逻辑非:反转操作数逻辑状态 | !(A && B) 为 true |
位运算符
位运算符按位操作。真值表:
| 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 (0011 1100),B = 13 (0000 1101):
A & B = 0000 1100 (12)
A | B = 0011 1101 (61)
A ^ B = 0011 0001 (49)
~A = 1100 0011 (-61,补码形式)
| 运算符 | 说明 | 示例 |
|---|---|---|
| & | 按位与:两操作数位均为 1 结果位为 1 | (A & B) = 12 |
| | | 按位或:任一操作数位为 1 结果位为 1 | (A | B) = 61 |
| ^ | 按位异或:位不同则结果位为 1 | (A ^ B) = 49 |
| ~ | 按位取反:翻转所有位 | (~A) = -61 |
| << | 左移:左操作数位左移右操作数指定位数 | A << 2 = 240 |
| >> | 右移:左操作数位右移右操作数指定位数 | A >> 2 = 15 |
赋值运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| = | 简单赋值 | C = A + B |
| += | 加后赋值 | 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() | 返回数据类型大小 | sizeof(int) 返回 4 |
| typeof() | 返回类类型 | typeof(StreamReader) |
| & | 返回变量地址 | &a 返回变量实际地址 |
| * | 指针声明 | *a 声明指向变量的指针 |
| ? : | 条件表达式 | Condition ? X : Y |
| is | 类型检查 | if (Ford is Car) |
| as | 安全转型(失败返回 null) | obj as StringReader |
运算符优先级
优先级决定表达式中项的结合顺序。优先级高的先计算。例如 x = 7 + 3 * 2 中,* 优先于 +,结果为 13 而非 20。
以下表格按优先级从高到低排列:
| 类别 | 运算符 | 结合性 |
|---|---|---|
| 后缀 | () [] -> . ++ -- | 左到右 |
| 一元 | + - ! ~ ++ -- (type)* & sizeof | 右到左 |
| 乘性 | * / % | 左到右 |
| 加性 | + - | 左到右 |
| 移位 | << >> | 左到右 |
| 关系 | < <= > >= | 左到右 |
| 相等 | == != | 左到右 |
| 按位与 | & | 左到右 |
| 按位异或 | ^ | 左到右 |
| 按位或 | | | 左到右 |
| 逻辑与 | && | 左到右 |
| 逻辑或 | || | 左到右 |
| 条件 | ?: | 右到左 |
| 赋值 | = += -= *= /= %= >>= <<= &= ^= |= | 右到左 |
| 逗号 | , | 左到右 |
C语言