第四章:运算符与表达式
4.1 算术运算符与优先级
算术运算符
用于数值计算,支持整型和浮点型数据:
运算符 | 描述 | 示例 | 说明 |
+ | 加法 | a + b | 两数相加 |
- | 减法 | a - b | 两数相减 |
* | 乘法 | a * b | 两数相乘 |
/ | 除法 | a / b | 若操作数均为整型,结果为整除;若含浮点型,结果为浮点除法。 |
% | 取模 | a % b | 求余数,仅用于整型。 |
优先级与结合性
优先级从高到低:
()
(括号)
*
, /
, %
+
, -
- 同级运算符按从左到右顺序计算。
示例
int a = 10 / 3; // 结果:3(整除)
float b = 10.0 / 3; // 结果:3.333333
int c = 10 % 3; // 结果:1
int d = 5 * (2 + 3); // 结果:25(括号优先)
4.2 关系运算符与逻辑运算符
关系运算符
比较两个值的大小关系,返回 1
(真)或 0
(假):
运算符 | 描述 | 示例 |
== | 等于 | a == b |
!= | 不等于 | a != b |
> | 大于 | a > b |
< | 小于 | a < b |
>= | 大于等于 | a >= b |
<= | 小于等于 | a <= b |
逻辑运算符
用于组合多个条件:
运算符 | 描述 | 示例 | 说明 |
&& | 逻辑与 | a && b | 两条件均为真时返回真(短路特性)。 |
\|\| | 逻辑或 | a \|\| b | 任一条件为真时返回真(短路特性)。 |
! | 逻辑非 | !a | 取反(真→假,假→真)。 |
示例
int x = 5, y = 10;
if (x > 0 && y < 20) { // 条件为真
printf("条件成立\n");
}
// 短路特性示例
int a = 0;
if (a != 0 && 10 / a > 2) { // 避免除以0错误
printf("不会执行\n");
}
4.3 位运算符(& | ^ ~ << >>)
位运算符
直接操作二进制位,仅用于整型数据:
运算符 | 描述 | 示例 | 说明 |
& | 按位与 | a & b | 二进制位同为1时结果为1。 |
\| | 按位或 | a \| b | 二进制位任一为1时结果为1。 |
^ | 按位异或 | a ^ b | 二进制位不同时结果为1。 |
~ | 按位取反 | ~a | 所有二进制位取反。 |
<< | 左移 | a << n | 二进制位左移n位,右侧补0。 |
>> | 右移 | a >> n | 二进制位右移n位,左侧补符号位(算术右移)或0(逻辑右移)。 |
示例
unsigned char a = 0b0011; // 二进制:00000011
unsigned char b = 0b0101; // 二进制:00000101
printf("%d\n", a & b); // 按位与:00000001 → 1
printf("%d\n", a | b); // 按位或:00000111 → 7
printf("%d\n", a ^ b); // 按位异或:00000110 → 6
printf("%d\n", ~a); // 按位取反:11111100 → 252(无符号)
printf("%d\n", a << 2); // 左移2位:00001100 → 12
printf("%d\n", b >> 1); // 右移1位:00000010 → 2
4.4 复合赋值运算符
复合赋值运算符
将算术或位运算与赋值结合,简化代码:
运算符 | 等价形式 | 示例 |
+= | a = a + b | a += 5; |
-= | a = a - b | a -= 3; |
*= | a = a * b | a *= 2; |
/= | a = a / b | a /= 4; |
%= | a = a % b | a %= 3; |
&= | a = a & b | a &= 0xFF; |
\|= | a = a \| b | a \|= 0x01; |
^= | a = a ^ b | a ^= 0x0F; |
<<= | a = a << b | a <<= 2; |
>>= | a = a >> b | a >>= 1; |
示例
int x = 10;
x += 5; // x = 15
x *= 2; // x = 30
x >>= 1; // x = 15
4.5 逗号运算符与条件运算符
逗号运算符
用于连接多个表达式,从左到右依次执行,最终结果为最后一个表达式的值。
语法
表达式1, 表达式2, ..., 表达式N;
示例
int a = (x = 5, y = 10, x + y); // a = 15
for (int i = 0, j = 10; i < j; i++, j--) { ... }
条件运算符(三元运算符)
简化 if-else
结构,语法:
条件 ? 表达式1 : 表达式2;
示例
int max = (a > b) ? a : b; // 等价于 if (a > b) max = a; else max = b;
printf("%s\n", (score >= 60) ? "及格" : "不及格");
总结
- 运算符优先级:括号 > 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。
- 短路特性:逻辑运算符
&&
和 ||
可优化性能并避免错误。
- 位运算应用:常用于硬件操作、数据加密和位掩码处理。
- 代码简洁性:复合赋值和条件运算符可简化代码,但需避免过度使用导致可读性下降。
通过灵活组合运算符,可以高效实现复杂逻辑,但务必注意优先级和数据类型限制!