Skip to content

C 运算符

运算符(Operators)是符号,用于对变量和值(操作数 operands)执行操作。C 提供了一套丰富的运算符。

执行数学计算。假设 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。

比较两个操作数并返回布尔结果(真为 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)。

组合或修改布尔表达式。操作数通常被视为真(非零),假(零)。假设 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 永远不会被求值)。

直接对整型操作数的二进制(位)表示执行操作。假设 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)。

给变量赋值。

运算符名称示例
=简单赋值将右操作数的值赋给左操作数。
+=加后赋值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)”
运算符名称描述示例
sizeofsizeof 运算符返回数据类型或变量的大小(以字节为单位)。结果类型为 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 运算符优先级表对于复杂表达式的理解很常见。