C 运算符
C - 运算符
Section titled “C - 运算符”运算符(Operators)是符号,用于对变量和值(操作数 operands)执行操作。C 提供了一套丰富的运算符。
算术运算符(Arithmetic Operators)
Section titled “算术运算符(Arithmetic Operators)”执行数学计算。假设 int A = 10; 且 int B = 20;:
| 运算符 | 名称 | 描述 | 示例 |
|---|---|---|---|
+ | 加法 | 相加两个操作数 | A + B 结果为 30 |
- | 减法 | 从第一个操作数中减去第二个操作数 | A - B 结果为 -10 |
* | 乘法 | 相乘两个操作数 | A * B 结果为 200 |
/ | 除法 | 用被除数除以除数。整型除法截断余数。 | B / A 结果为 2。10 / 3 结果为 3。 |
% | 取模 | 得到整型除法的余数。 | B % A 结果为 0。10 % 3 结果为 1。 |
++ | 自增 | 将整型值增加一。可以是前缀(++A)或后缀(A++)。 | A++ 的求值结果为 10,然后 A 变为 11。++A 先使 A 变为 11,然后求值结果为 11。 |
-- | 自减 | 将整型值减少一。可以是前缀(—A)或后缀(A—)。 | A— 的求值结果为 10,然后 A 变为 9。—A 先使 A 变为 9,然后求值结果为 9。 |
关系运算符(Relational Operators)
Section titled “关系运算符(Relational Operators)”比较两个操作数并返回布尔结果(真为 1,假为 0)。假设 int A = 10; 且 int B = 20;:
| 运算符 | 名称 | 描述 | 示例 |
|---|---|---|---|
== | 等于 | 检查值是否相等。 | (A == B) 为假 (0)。 |
!= | 不等于 | 检查值是否不相等。 | (A != B) 为真 (1)。 |
> | 大于 | 检查左操作数是否大于右操作数。 | (A > B) 为假 (0)。 |
< | 小于 | 检查左操作数是否小于右操作数。 | (A < B) 为真 (1)。 |
>= | 大于或等于 | 检查左操作数是否大于或等于右操作数。 | (A >= B) 为假 (0)。 |
<= | 小于或等于 | 检查左操作数是否小于或等于右操作数。 | (A <= B) 为真 (1)。 |
逻辑运算符(Logical Operators)
Section titled “逻辑运算符(Logical Operators)”组合或修改布尔表达式。操作数通常被视为真(非零),假(零)。假设 int A = 1;(真)且 int B = 0;(假)。
| 运算符 | 名称 | 描述 | 示例 |
|---|---|---|---|
&& | 逻辑与 | 当两个操作数都为真(非零)时为真 (1)。 | (A && B) 为假 (0)。 |
|| | 逻辑或 | 当至少一个操作数为真(非零)时为真 (1)。 | (A || B) 为真 (1)。 |
! | 逻辑非 | 反转逻辑状态:将真变为假,将假变为真。 | !(A && B) 为真 (1)。!A 为假 (0)。 |
逻辑与(&&)和逻辑或(||)执行短路求值(short-circuit evaluation):如果可以仅根据左操作数确定结果,则不求值右操作数(例如,在 false && expression 中,expression 永远不会被求值)。
位运算符(Bitwise Operators)
Section titled “位运算符(Bitwise Operators)”直接对整型操作数的二进制(位)表示执行操作。假设 unsigned char A = 60; (0011 1100) 且 unsigned char B = 13; (0000 1101)。
| 运算符 | 名称 | 描述 | 示例 (使用 8 位) |
|---|---|---|---|
& | 按位与 | 如果两个相应的位都为 1,则将每个位设置为 1。 | A & B 结果为 12 (0000 1100)。 |
| | 按位或 | 如果至少一个相应的位为 1,则将每个位设置为 1。 | A | B 结果为 61 (0011 1101)。 |
^ | 按位异或 | 如果相应的位不同,则将每个位设置为 1。 | A ^ B 结果为 49 (0011 0001)。 |
~ | 按位非 (按位取反) | 翻转所有位(0 变为 1,1 变为 0)。一元运算符。 | ~A 取决于大小,对于 8 位:1100 0011(如果为无符号数,则为十进制 195;如果为有符号数,则为 2 的补码 -61)。 |
<< | 左移 | 将位向左移动,右边用 0 填充。x << n 等效于 x * 2^n。 | A << 2 结果为 240 (1111 0000)。 |
>> | 右移 | 将位向右移动。对于无符号类型,左边用 0 填充(逻辑右移)。对于有符号类型,行为是实现定义的(可以是逻辑右移或算术右移 - 用符号位填充)。x >> n 大约等于 x / 2^n。 | A >> 2 结果为 15 (0000 1111)。 |
赋值运算符(Assignment Operators)
Section titled “赋值运算符(Assignment Operators)”给变量赋值。
| 运算符 | 名称 | 示例 |
|---|---|---|
= | 简单赋值 | 将右操作数的值赋给左操作数。 |
+= | 加后赋值 | 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 的简写 |
其他运算符(Miscellaneous Operators)
Section titled “其他运算符(Miscellaneous Operators)”| 运算符 | 名称 | 描述 | 示例 |
|---|---|---|---|
sizeof | sizeof 运算符 | 返回数据类型或变量的大小(以字节为单位)。结果类型为 size_t。 | sizeof(int), sizeof(myVariable) |
& | 取地址运算符 | 返回变量的内存地址。一元运算符。 | &myVariable |
* | 解引用运算符 (间接访问) | 访问指针指向的内存地址中存储的值。一元运算符。 | *pointerVariable |
? : | 三元条件运算符 | if-else 的简写。condition ? value_if_true : value_if_false。 | max = (a > b) ? a : b; |
, | 逗号运算符 | 从左到右依次对表达式求值,结果是最右边表达式的值。常用于 for 循环中。 | x=1, y=2, z=x+y (z 变为 3) |
运算符优先级和结合性(Operator Precedence and Associativity)
Section titled “运算符优先级和结合性(Operator Precedence and Associativity)”优先级决定运算符在表达式中的求值顺序(如乘法先于加法)。结合性决定优先级相同的运算符的求值顺序(例如,加法/减法是左到右,赋值是右到左)。
优先级最高的运算符先求值。使用括号 () 来覆盖优先级或澄清顺序。
| 类别 | Operator | 结合性 |
|---|---|---|
| 后缀 | () [] -> . ++ -- | 从左到右 |
| 一元 | + - ! ~ ++ -- (type)* & sizeof | 从右到左 |
| 乘法 | * / % | 从左到右 |
| 加法 | + - | 从左到右 |
| 移位 | << >> | 从左到右 |
| 关系 | < <= > >= | 从左到右 |
| 相等 | == != | 从左到右 |
| 按位与 | & | 从左到右 |
| 按位异或 | ^ | 从左到右 |
| 按位或 | | | 从左到右 |
| 逻辑与 | && | 从左到右 |
| 逻辑或 | || | 从左到右 |
| 条件 | ?: | 从右到左 |
| 赋值 | = += -= *= /= %= >>= <<= &= ^= |= | 从右到左 |
| 逗号 | , | 从左到右 |
查阅在线的 C 运算符优先级表对于复杂表达式的理解很常见。