一、算术运算符
算术运算符用于完成基本的数值运算,是C语言中最基础的运算符类型。
1. 核心运算符列表
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
+ |
加法 | 3 + 5 |
8 |
- |
减法 | 10 - 4 |
6 |
* |
乘法 | 2 * 7 |
14 |
/ |
除法 | 7 / 2 |
3(整数除法) |
% |
取余(求模) | 7 % 2 |
1 |
2. 关键用法与注意事项
-
整数除法规则 :两个整数相除时,结果为整数,向零取整(舍去小数部分)。若需要得到浮点数结果,至少有一个操作数为浮点数。
printf("%d\n", 5 / 2); // 输出2 printf("%f\n", 5.0 / 2); // 输出2.500000 printf("%f\n", 5 / 2.0); // 输出2.500000 -
取余运算规则:
-
仅允许整数类型 操作数参与,浮点数不能使用
%运算符。 -
结果的符号与被除数一致。
printf("%d\n", 10 % 3); // 输出1
printf("%d\n", -10 % 3); // 输出-1
printf("%d\n", 10 % -3); // 输出1
-
二、关系运算符
关系运算符用于比较两个数值的大小关系,运算结果为逻辑值:真(1) 或 假(0)。
1. 核心运算符列表
| 运算符 | 含义 | 示例(a=5, b=3) | 结果 |
|---|---|---|---|
> |
大于 | a > b |
1 |
>= |
大于等于 | a >= 5 |
1 |
< |
小于 | a < b |
0 |
<= |
小于等于 | b <= 3 |
1 |
== |
等于 | a == b |
0 |
!= |
不等于 | a != b |
1 |
2. 关键注意事项
-
区分
==与=:==是关系运算符,用于判断相等;=是赋值运算符,用于给变量赋值。初学者极易混淆,错误使用会导致逻辑bug。// 错误写法:将b的值赋给a,条件永远为真(b≠0时) if (a = b) { printf("a等于b"); } // 正确写法:判断a和b是否相等 if (a == b) { printf("a等于b"); }
三、逻辑运算符
逻辑运算符用于组合多个关系表达式,实现复杂的条件判断,运算结果同样为逻辑值1(真)或0(假)。
1. 核心运算符列表
| 运算符 | 含义 | 运算规则 | 示例(a=5, b=0) | 结果 |
|---|---|---|---|---|
! |
逻辑非(单目) | 真变假,假变真 | !a |
0 |
&& |
逻辑与(双目) | 两边都为真,结果才为真 | a>0 && b>0 |
0 |
| ` | ` | 逻辑或(双目) | 只要有一边为真,结果就为真 |
2. 关键特性:短路求值
逻辑运算符具有短路求值特性,即当左侧表达式已经能确定整个逻辑表达式的结果时,右侧表达式将不再执行:
-
对于
&&:若左侧为假,直接返回假,右侧不执行。 -
对于
||:若左侧为真,直接返回真,右侧不执行。int c = 0;
// 左侧a<0为假,++c不执行
if (a < 0 && ++c > 0) {
printf("条件成立");
}
printf("%d\n", c); // 输出0,c未被修改// 左侧a>0为真,++c不执行
if (a > 0 || ++c > 0) {
printf("条件成立");
}
printf("%d\n", c); // 仍输出0
四、赋值运算符
赋值运算符用于将右侧表达式的值赋给左侧的变量,分为基本赋值运算符和复合赋值运算符两类。
1. 基本赋值运算符
-
符号:
=。 -
作用:将右侧表达式的值存储到左侧变量对应的内存单元中。
-
注意:赋值运算符左侧必须是可修改的左值(如变量),不能是常量或表达式。
int a; a = 10; // 正确 10 = a; // 错误,常量不能作为左值 a + 1 = 20; // 错误,表达式不能作为左值
2. 复合赋值运算符
复合赋值运算符是算术运算符与基本赋值运算符的结合,用于简化代码,提高编译效率。
| 复合运算符 | 等价形式 | 示例(a=5) | 结果 |
|---|---|---|---|
+= |
a = a + 表达式 |
a += 3 |
8 |
-= |
a = a - 表达式 |
a -= 2 |
3 |
*= |
a = a * 表达式 |
a *= 4 |
20 |
/= |
a = a / 表达式 |
a /= 2 |
2 |
%= |
a = a % 表达式 |
a %= 3 |
2 |
五、运算符优先级与结合性
当一个表达式中包含多种运算符时,按照优先级从高到低 的顺序执行;优先级相同时,按照结合性决定执行方向。
1. 核心运算符优先级总表(从高到低)
| 优先级 | 运算符类别 | 运算符 | 结合性 |
|---|---|---|---|
| 1 | 逻辑非 | ! |
右结合 |
| 2 | 算术运算符 | *``/``% |
左结合 |
| 3 | 算术运算符 | +``- |
左结合 |
| 4 | 关系运算符 | >``>=``<``<= |
左结合 |
| 5 | 关系运算符 | ==``!= |
左结合 |
| 6 | 逻辑运算符 | && |
左结合 |
| 7 | 逻辑运算符 | ` | |
| 8 | 赋值运算符 | =``+=``-=``*=``/=``%= |
右结合 |
2. 优先级记忆口诀
非算关逻赋(逻辑非 > 算术 > 关系 > 逻辑与/或 > 赋值),括号可以改变优先级,复杂表达式建议使用括号明确执行顺序,提高代码可读性。
六、要点总结
-
算术运算符中重点掌握整数除法的向零取整规则和取余运算的整数限制。
-
关系运算符中务必区分
==和=,这是初学者最常见的错误点。 -
逻辑运算符的短路特性是高频考点,会影响程序的执行流程。
-
复合赋值运算符可以简化代码,且编译效率更高,推荐在合适场景使用。
-
复杂表达式优先使用括号明确优先级,避免因运算符优先级导致的逻辑错误。