C语言运算符大全:算术/关系/逻辑/赋值运算符详解与优先级指南

C语言运算符详解:从算术运算到逻辑运算,一文掌握运算符优先级

​全面讲解C语言各类运算符的使用方法,包括算术、关系、逻辑、赋值运算符等,并附有详细的优先级表和实战示例。

在学会了如何存储数据(变量)和输入输出数据后,下一步就是要让程序能够”思考”和”计算”。C语言通过丰富的运算符来实现这一功能。本篇教程将系统性地讲解C语言中的各种运算符,包括算术运算、关系比较、逻辑判断等,并最终让你掌握复杂的运算符优先级规则。

1. 什么是运算符和表达式?

  • 运算符​:用于执行程序代码运算的符号,如加号+、等号=
  • 操作数​:参与运算的数据,如a + b中的ab
  • 表达式​:由运算符和操作数组成的式子,如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. 运算符优先级

当表达式中包含多个运算符时,优先级决定了运算的执行顺序。优先级高的先执行,优先级相同的从左到右执行。

基本优先级规则(从高到低):​

  1. ()括号 – 优先级最高,用于强制改变顺序
  2. */%算术运算符
  3. +-算术运算符
  4. ><>=<=关系运算符
  5. ==!=关系运算符
  6. &&逻辑与
  7. ||逻辑或
  8. =赋值运算符
#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. 动手练习

  1. 基础练习​:编写程序,输入一个三位数,分别计算并输出其个位、十位和百位数字。
    // 提示:使用 / 和 % 运算符
    // 例如:输入123,输出:百位=1,十位=2,个位=3
  2. 进阶练习​:编写一个简单的时间转换程序,输入总秒数,转换成”时:分:秒”的格式输出。
    // 例如:输入4000秒,输出:1小时6分钟40秒
    // 提示:1小时=3600秒,1分钟=60秒
  3. 挑战练习​:编写程序判断一个年份是否是闰年。闰年规则:
    • 能被4整除但不能被100整除,或者
    • 能被400整除
    // 输入:2024,输出:2024是闰年
    // 输入:1900,输出:1900不是闰年

发表评论