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不是闰年