C语言运算符大全:算术/关系/逻辑/赋值运算符详解与优先级指南
C语言运算符详解:从算术运算到逻辑运算,一文掌握运算符优先级
全面讲解C语言各类运算符的使用方法,包括算术、关系、逻辑、赋值运算符等,并附有详细的优先级表和实战示例。
在学会了如何存储数据(变量)和输入输出数据后,下一步就是要让程序能够”思考”和”计算”。C语言通过丰富的运算符来实现这一功能。本篇教程将系统性地讲解C语言中的各种运算符,包括算术运算、关系比较、逻辑判断等,并最终让你掌握复杂的运算符优先级规则。
1. 什么是运算符和表达式?
- 运算符:用于执行程序代码运算的符号,如加号
+、等号=。 - 操作数:参与运算的数据,如
a + b中的a和b。 - 表达式:由运算符和操作数组成的式子,如
a + b * c,表达式最终会产生一个结果。
2. 算术运算符
算术运算符用于执行基本的数学运算。
| 运算符 | 描述 | 示例 | 结果 |
|---|---|---|---|
+ |
加法 | 5 + 3 |
8 |
- |
减法 | 5 - 3 |
2 |
* |
乘法 | 5 * 3 |
15 |
/ |
除法 | 5 / 3 |
1(整数除法) |
% |
取模(求余数) | 5 % 3 |
2 |
重要细节:
- 整数除法:当两个整数相除时,结果会被截断为整数(舍去小数部分)。
5 / 2的结果是2,不是2.5。 - 取模运算:只能用于整数,求的是除法后的余数。
10 % 3的结果是1。
#include <stdio.h>
int main() {
int a = 10, b = 3;
printf("a + b = %d\n", a + b); // 13
printf("a - b = %d\n", a - b); // 7
printf("a * b = %d\n", a * b); // 30
printf("a / b = %d\n", a / b); // 3(整数除法)
printf("a %% b = %d\n", a % b); // 1(注意:printf中要输出%需要写两个%)
float result = a / b; // 小心!这里仍然是整数除法
printf("a / b (float) = %f\n", result); // 3.000000
// 正确的浮点数除法:将至少一个操作数转为浮点型
float correct_result = (float)a / b;
printf("(float)a / b = %f\n", correct_result); // 3.333333
return 0;
}
3. 关系运算符
关系运算符用于比较两个值,结果为真(1)或假(0)。
| 运算符 | 描述 | 示例 | 结果 |
|---|---|---|---|
== |
等于 | 5 == 3 |
0(假) |
!= |
不等于 | 5 != 3 |
1(真) |
> |
大于 | 5 > 3 |
1(真) |
< |
小于 | 5 < 3 |
0(假) |
>= |
大于等于 | 5 >= 5 |
1(真) |
<= |
小于等于 | 5 <= 3 |
0(假) |
#include <stdio.h>
int main() {
int x = 10, y = 20;
printf("x == y: %d\n", x == y); // 0
printf("x != y: %d\n", x != y); // 1
printf("x > y: %d\n", x > y); // 0
printf("x < y: %d\n", x < y); // 1
printf("x >= 10: %d\n", x >= 10); // 1
// 关系表达式可以参与运算
int result = (x < y) + 5;
printf("(x < y) + 5 = %d\n", result); // 1 + 5 = 6
return 0;
}
4. 逻辑运算符
逻辑运算符用于组合多个条件判断。
| 运算符 | 描述 | 示例 | 结果 |
|---|---|---|---|
&& |
逻辑与(AND) | (5 > 3) && (5 < 10) |
1(两个都为真) |
| ` | ` | 逻辑或(OR) | |
! |
逻辑非(NOT) | !(5 == 3) |
1(取反) |
逻辑运算的真值表:
| A | B | A && B | A ||B | !A |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 |
#include <stdio.h>
int main() {
int age = 25;
int has_license = 1; // 1表示真,0表示假
// 判断是否可以开车:年龄>=18且拥有驾照
int can_drive = (age >= 18) && has_license;
printf("可以开车: %d\n", can_drive); // 1
// 判断是否可以享受折扣:年龄<=12或年龄>=60
int has_discount = (age <= 12) || (age >= 60);
printf("享受折扣: %d\n", has_discount); // 0
// 取反操作
printf("不能开车: %d\n", !can_drive); // 0
return 0;
}
5. 赋值运算符
除了基本的=赋值,C语言还提供了复合赋值运算符。
| 运算符 | 示例 | 等价于 |
|---|---|---|
= |
a = 5 |
a = 5 |
+= |
a += 3 |
a = a + 3 |
-= |
a -= 3 |
a = a - 3 |
*= |
a *= 3 |
a = a * 3 |
/= |
a /= 3 |
a = a / 3 |
%= |
a %= 3 |
a = a % 3 |
#include <stdio.h>
int main() {
int a = 10;
a += 5; // 等价于 a = a + 5
printf("a = %d\n", a); // 15
a *= 2; // 等价于 a = a * 2
printf("a = %d\n", a); // 30
a %= 7; // 等价于 a = a % 7
printf("a = %d\n", a); // 2
return 0;
}
6. 运算符优先级
当表达式中包含多个运算符时,优先级决定了运算的执行顺序。优先级高的先执行,优先级相同的从左到右执行。
基本优先级规则(从高到低):
()括号 – 优先级最高,用于强制改变顺序*/%算术运算符+-算术运算符><>=<=关系运算符==!=关系运算符&&逻辑与||逻辑或=赋值运算符
#include <stdio.h>
int main() {
int a = 5, b = 3, c = 2;
int result1 = a + b * c; // 5 + (3 * 2) = 11
int result2 = (a + b) * c; // (5 + 3) * 2 = 16
int result3 = a > b && b < c; // (5 > 3) && (3 < 2) = 1 && 0 = 0
printf("result1 = %d\n", result1);
printf("result2 = %d\n", result2);
printf("result3 = %d\n", result3);
return 0;
}
最佳实践: 当不确定优先级时,使用括号()来明确指定运算顺序,这样既安全又易于阅读。
7. 动手练习
- 基础练习:编写程序,输入一个三位数,分别计算并输出其个位、十位和百位数字。
// 提示:使用 / 和 % 运算符 // 例如:输入123,输出:百位=1,十位=2,个位=3 - 进阶练习:编写一个简单的时间转换程序,输入总秒数,转换成”时:分:秒”的格式输出。
// 例如:输入4000秒,输出:1小时6分钟40秒 // 提示:1小时=3600秒,1分钟=60秒 - 挑战练习:编写程序判断一个年份是否是闰年。闰年规则:
- 能被4整除但不能被100整除,或者
- 能被400整除
// 输入:2024,输出:2024是闰年 // 输入:1900,输出:1900不是闰年