C 运算符
C 运算符
在 C 语言中,运算符(Operators) 是用于对变量或常量进行操作的符号。它们是构成表达式的基本元素,也是程序逻辑和数据处理的核心工具。
一、学习目标 🎯
- 掌握 C 语言中常见运算符的分类与使用方法。
- 理解运算符的优先级和结合性,避免逻辑错误。
- 能够灵活运用运算符编写高效、清晰的表达式和判断语句。
二、核心重点 🔑
- C 运算符分为:算术、关系、逻辑、位运算、赋值、条件(三目)、逗号等类型。
- 运算符的优先级决定表达式的计算顺序,括号可改变默认顺序。
- 理解副作用和短路特性,避免因误用导致难以调试的 bug。
三、详细讲解
✅ 1. 算术运算符(Arithmetic Operators)
运算符 | 含义 | 示例 |
---|---|---|
+ |
加法 | a + b |
- |
减法 | a - b |
* |
乘法 | a * b |
/ |
除法 | a / b |
% |
取模(取余) | a % b (仅适用于整数) |
示例:
int a = 10, b = 3;
printf("a + b = %d\n", a + b); // 输出 13
printf("a / b = %d\n", a / b); // 输出 3(整数除法)
printf("a %% b = %d\n", a % b); // 输出 1
⚠️ 注意事项:
- 除法
/
对于两个整数会执行整数除法(向下取整)。- 使用浮点数时,结果为小数。
- 模运算
%
不能用于浮点数。
✅ 2. 关系运算符(Relational Operators)
运算符 | 含义 | 示例 |
---|---|---|
== |
等于 | a == b |
!= |
不等于 | a != b |
> |
大于 | a > b |
< |
小于 | a < b |
>= |
大于等于 | a >= b |
<= |
小于等于 | a <= b |
返回值为布尔类型(在 C 中为 int
类型):
1
表示真(true)0
表示假(false)
示例:
int a = 5, b = 10;
printf("a > b: %d\n", a > b); // 输出 0
printf("a == 5: %d\n", a == 5); // 输出 1
⚠️ 注意事项:
- 判断是否相等使用
==
,不要写成赋值运算符=
。- 在条件判断中要特别注意比较对象的数据类型是否一致。
✅ 3. 逻辑运算符(Logical Operators)
运算符 | 含义 | 示例 |
---|---|---|
&& |
逻辑与 | a > 0 && b < 10 |
|| |
逻辑或 | a == 0 || b == 0 |
! |
逻辑非 | !(a == b) |
返回值同样是 int
类型:
1
表示“真”0
表示“假”
示例:
int age = 25;
if (age >= 18 && age <= 60) {
printf("成年人且未退休\n");
}
⚠️ 注意事项:
- 短路求值(Short-circuit evaluation):
&&
左边为假时,右边不再计算;||
左边为真时,右边不再计算。- 常用于避免运行时错误,例如:
if (ptr != NULL && ptr->value > 0)
✅ 4. 位运算符(Bitwise Operators)
运算符 | 含义 | 示例 |
---|---|---|
& |
按位与 | a & b |
| |
按位或 | a | b |
^ |
按位异或 | a ^ b |
~ |
按位取反 | ~a |
<< |
左移 | a << 2 |
>> |
右移 | a >> 1 |
示例:
unsigned char a = 0b10101010; // 二进制表示
unsigned char mask = 0b00001111;
unsigned char result = a & mask; // 结果为 0b00001010
printf("Result: %u\n", result);
⚠️ 注意事项:
- 位运算通常用于底层编程(如嵌入式开发)或性能优化。
- 移位操作时要注意符号扩展问题(右移负数可能行为不一致)。
✅ 5. 赋值运算符(Assignment Operators)
运算符 | 含义 | 示例 |
---|---|---|
= |
赋值 | a = 5 |
+= |
加后赋值 | a += 3 |
-= |
减后赋值 | a -= 2 |
*= |
乘后赋值 | a *= 4 |
/= |
除后赋值 | a /= 2 |
%= |
取模后赋值 | a %= 3 |
示例:
int x = 10;
x += 5; // 等价于 x = x + 5;
✅ 6. 条件运算符(三目运算符)(Ternary Operator)
语法格式:
condition ? expression_if_true : expression_if_false
示例:
int max = (a > b) ? a : b;
⚠️ 注意事项:
- 三目运算符应简洁使用,避免嵌套过深影响可读性。
- 可以替代简单的
if...else
结构。
✅ 7. 逗号运算符(Comma Operator)
逗号 ,
允许在一个表达式中执行多个操作,整个表达式的值是最后一个子表达式的值。
示例:
int a = (1, 2, 3); // a 的值为 3
实战应用:
for(int i=0, j=10; i<j; i++, j--) {
printf("i=%d, j=%d\n", i, j);
}
四、运算符优先级与结合性(重要!)
优先级 | 运算符 | 结合方向 |
---|---|---|
1 | () [] -> . |
从左到右 |
2 | ! ~ ++ -- (type) * & sizeof |
从右到左 |
3 | * / % |
从左到右 |
4 | + - |
从左到右 |
5 | << >> |
从左到右 |
6 | < <= > >= |
从左到右 |
7 | == != |
从左到右 |
8 | & |
从左到右 |
9 | ^ |
从左到右 |
10 | ` | ` |
11 | && |
从左到右 |
12 | ` | |
13 | ?: |
从右到左 |
14 | = += -= *= 等赋值 |
从右到左 |
15 | , |
从左到右 |
⚠️ 建议:
- 不确定优先级时,使用括号明确计算顺序。
- 避免一行代码中使用过多复杂运算符,提升可维护性。
五、拓展练习 🧩
🧩 练习题 1:判断奇偶数
使用取模运算符 %
和条件运算符 ?:
编写一个程序,输入一个整数,输出它是“奇数”还是“偶数”。
🧩 练习题 2:交换两个整数的值
不用临时变量,使用加减法或异或运算符 ^
实现两个整数的交换。
🧩 练习题 3:判断闰年
根据以下规则编写判断闰年的逻辑表达式:
- 能被 4 整除但不能被 100 整除的是闰年;
- 或能被 400 整除的也是闰年。
🧩 练习题 4:提取字节中的某一位
给定一个 char
类型的变量,写一个函数判断其第 n 位(从低位开始计数)是否为 1。
六、实战建议总结
场景 | 推荐使用的运算符 |
---|---|
数学运算 | + , - , * , / , % |
条件判断 | == , != , > , < |
多条件组合判断 | && , || , ! |
提高性能/底层操作 | << , >> , & , | |
快速赋值 | += , -= , *= |
简洁分支逻辑 | ?: |
控制结构初始化 | , |
恭喜你完成了《C 运算符》这一章的学习!
这是构建所有 C 程序逻辑的基础,掌握得好可以写出高效、安全、优雅的代码!
✅ 下一章推荐学习内容(任选其一):
- 《C 控制结构:if、switch、循环》
- 《C 数据类型与类型转换》
- 《C 函数详解:参数传递、调用栈、递归》
- 《C 指针入门:地址、指针变量、数组访问》
你想继续学哪个?我来为你定制下一章 👇