C++: 运算符全览
最后更新:2026-08-26
第03课我们学会了用变量存数据。
但光存数据不够,还得能对数据做运算——比如加减乘除、比较大小、判断真假。
这就是运算符的作用。就像数学里的 +、-、×、÷,C++ 里也有一套运算符。
1. 运算符的分类
C++ 的运算符可以分成几大类:
| 类别 | 运算符 | 作用 |
|---|---|---|
| 算术运算符 | +, -, *, /, % |
做数学运算 |
| 关系运算符 | ==, !=, >, <, >=, <= |
比较大小 |
| 逻辑运算符 | &&, ` |
|
| 赋值运算符 | =, +=, -=, *=, /= |
给变量赋值 |
| 自增/自减 | ++, -- |
变量加1或减1 |
| 其他 | sizeof, ? :, ., -> |
后面会学 |
2. 算术运算符
(1) 2.1 五种基本算术运算符
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
+ |
加 | 10 + 3 |
13 |
- |
减 | 10 - 3 |
7 |
* |
乘 | 10 * 3 |
30 |
/ |
除 | 10 / 3 |
3(注意!) |
% |
取余 | 10 % 3 |
1 |
💡 重点:/ 运算符的陷阱
CPP
#include <iostream>
int main() {
int a = 10;
int b = 3;
std::cout << "10 / 3 = " << a / b << std::endl; // 输出 3(整数除法,丢弃小数部分)
double c = 10.0;
double d = 3.0;
std::cout << "10.0 / 3.0 = " << c / d << std::endl; // 输出 3.33333
return 0;
}
规则:
- 如果两个整数相除,结果还是整数(小数部分被丢弃)
- 如果有一个是浮点数,结果就是浮点数
(2) 2.2 取余运算符 %
% 用来求"余数":
CPP
#include <iostream>
int main() {
std::cout << "10 % 3 = " << 10 % 3 << std::endl; // 1
std::cout << "20 % 7 = " << 20 % 7 << std::endl; // 6
std::cout << "5 % 5 = " << 5 % 5 << std::endl; // 0
// 判断奇偶性
int num = 7;
if (num % 2 == 0) {
std::cout << num << " 是偶数" << std::endl;
} else {
std::cout << num << " 是奇数" << std::endl;
}
return 0;
}
💡 提示: % 只能用于整数,不能用于浮点数(10.5 % 3 会报错)。
3. 关系运算符
关系运算符用来比较两个值,结果是 true 或 false。
(1) 3.1 六种关系运算符
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
== |
等于 | 5 == 3 |
false |
!= |
不等于 | 5 != 3 |
true |
> |
大于 | 5 > 3 |
true |
< |
小于 | 5 < 3 |
false |
>= |
大于等于 | 5 >= 5 |
true |
<= |
小于等于 | 5 <= 3 |
false |
💡 重点:别把 == 写成 =!
CPP
int age = 18;
if (age = 20) { // ❌ 错误:这是赋值,不是比较!
std::cout << "成年了" << std::endl;
}
// 上面这段代码永远输出"成年了",因为 age = 20 把 20 赋给了 age,然后判断 age 是否为真(非0),永远是 true
正确写法:
CPP
if (age == 20) { // ✅ 正确:这是比较
std::cout << "刚好 20 岁" << std::endl;
}
💡 防坑技巧: 把常量写在前面,这样如果写成 = 会编译报错:
CPP
if (20 = age) { // ❌ 编译报错:不能给常量赋值
if (20 == age) { // ✅ 正确
4. 逻辑运算符
逻辑运算符用来组合多个条件。
(1) 4.1 三种逻辑运算符
| 运算符 | 名称 | 规则 | 示例 |
|---|---|---|---|
&& |
逻辑与(AND) | 两边都为真,结果才为真 | (5 > 3) && (10 > 5) → true |
| ` | ` | 逻辑或(OR) | |
! |
逻辑非(NOT) | 取反 | !(5 > 3) → false |
▶ 示例 1:判断闰年(难度⭐)
CPP
#include <iostream>
int main() {
int year;
std::cout << "请输入一个年份:";
std::cin >> year;
// 闰年规则:能被4整除但不能被100整除,或者能被400整除
bool isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
if (isLeapYear) {
std::cout << year << " 是闰年" << std::endl;
} else {
std::cout << year << " 不是闰年" << std::endl;
}
return 0;
}
输出:
TEXT
📖 仅展示
请输入一个年份:
是闰年
不是闰年
运行效果:
TEXT
📖 仅展示
请输入一个年份:2024
2024 是闰年
(2) 4.2 短路求值(Short-circuit Evaluation)
C++ 有"短路"机制:
&&:如果左边为假,右边不会执行(因为结果已经确定是假)||:如果左边为真,右边不会执行(因为结果已经确定是真)
CPP
#include <iostream>
int main() {
int x = 5;
// 短路示例
if (x > 10 && (x = 100)) { // x > 10 为假,右边的 x = 100 不会执行
// ...
}
std::cout << "x = " << x << std::endl; // 输出 x = 5(没有被改成100)
return 0;
}
💡 提示: 利用短路特性,可以把"容易为假的条件"放在 && 的左边,提高程序效率。
5. 赋值运算符
(1) 5.1 基本赋值运算符 =
CPP
int x = 5; // 把 5 赋给 x
(2) 5.2 复合赋值运算符
| 运算符 | 等价于 | 示例 |
|---|---|---|
+= |
x = x + y |
x += 5; → x = x + 5; |
-= |
x = x - y |
x -= 3; → x = x - 3; |
*= |
x = x * y |
x *= 2; → x = x * 2; |
/= |
x = x / y |
x /= 4; → x = x / 4; |
%= |
x = x % y |
x %= 3; → x = x % 3; |
示例:
CPP
#include <iostream>
int main() {
int x = 10;
x += 5; // x 变成 15
x -= 3; // x 变成 12
x *= 2; // x 变成 24
x /= 4; // x 变成 6
x %= 4; // x 变成 2
std::cout << "x = " << x << std::endl; // 输出 x = 2
return 0;
}
💡 提示: 复合赋值运算符不仅写起来简洁,而且有些情况下编译器能生成更高效的代码。
6. 自增和自减运算符
++ 和 -- 是 C++ 的特色运算符(C++ 的名字就来自此)。
(1) 6.1 基本用法
| 运算符 | 名称 | 作用 | 等价于 |
|---|---|---|---|
++x |
前自增 | x 先加1,然后返回新值 | x = x + 1; return x; |
x++ |
后自增 | 先返回原值,然后 x 加1 | temp = x; x = x + 1; return temp; |
--x |
前自减 | x 先减1,然后返回新值 | x = x - 1; return x; |
x-- |
后自减 | 先返回原值,然后 x 减1 | temp = x; x = x - 1; return temp; |
▶ 示例 2:前自增 vs 后自增(难度⭐⭐)
CPP
#include <iostream>
int main() {
int a = 5;
int b = 5;
std::cout << "a = " << a << ", ++a = " << ++a << ", a = " << a << std::endl;
// 输出:a = 5, ++a = 6, a = 6
std::cout << "b = " << b << ", b++ = " << b++ << ", b = " << b << std::endl;
// 输出:b = 5, b++ = 5, b = 6
return 0;
}
输出:
TEXT
📖 仅展示
a = 5, ++a = 6, a = 6
b = 5, b++ = 5, b = 6
💡 记忆技巧:
++x:先加后用(x 先加1,然后用新值)x++:先用后加(先用原值,然后 x 加1)
(2) 6.2 常见用法
CPP
for (int i = 0; i < 10; i++) { // 这里 i++ 和 ++i 效果一样
// ...
}
int x = 5;
int y = x++; // y = 5, x = 6
int z = ++x; // x 先加1变成7, z = 7
💡 建议: 如果没有特殊需求,优先用 ++i 而不是 i++——对于自定义类型(后面会学),++i 可能更高效。
7. 运算符优先级
当一个表达式里有多个运算符时,C++ 会按照优先级决定先算谁。
(1) 7.1 优先级表(部分)
| 优先级 | 运算符 | 结合性 |
|---|---|---|
| 1(最高) | ++, --(后置), ()(函数调用) |
左到右 |
| 2 | ++, --(前置), !, -(负号) |
右到左 |
| 3 | *, /, % |
左到右 |
| 4 | +, -(减号) |
左到右 |
| 5 | <, <=, >, >= |
左到右 |
| 6 | ==, != |
左到右 |
| 7 | && |
左到右 |
| 8 | ` | |
| 9(最低) | =, +=, -=, ... |
右到左 |
▶ 示例 3:优先级的影响(难度⭐⭐)
CPP
#include <iostream>
int main() {
int result1 = 5 + 3 * 2; // 先算 3 * 2 = 6,再算 5 + 6 = 11
int result2 = (5 + 3) * 2; // 先算括号里的 5 + 3 = 8,再算 8 * 2 = 16
std::cout << "5 + 3 * 2 = " << result1 << std::endl; // 11
std::cout << "(5 + 3) * 2 = " << result2 << std::endl; // 16
return 0;
}
输出:
TEXT
📖 仅展示
5 + 3 * 2 = 11
(5 + 3) * 2 = 16
💡 黄金法则: 如果不确定优先级,加括号!括号不仅能保证正确性,还能让代码更易读。
8. 实战:成绩评级程序
▶ 示例 4:根据分数评级(难度⭐⭐)
CPP
#include <iostream>
int main() {
int score;
std::cout << "请输入你的成绩(0-100):";
std::cin >> score;
if (score >= 90 && score <= 100) {
std::cout << "优秀!评级:A" << std::endl;
} else if (score >= 80 && score < 90) {
std::cout << "良好!评级:B" << std::endl;
} else if (score >= 70 && score < 80) {
std::cout << "中等!评级:C" << std::endl;
} else if (score >= 60 && score < 70) {
std::cout << "及格!评级:D" << std::endl;
} else if (score >= 0 && score < 60) {
std::cout << "不及格!评级:F" << std::endl;
} else {
std::cout << "错误:成绩必须在 0-100 之间!" << std::endl;
}
return 0;
}
输出:
TEXT
📖 仅展示
请输入你的成绩(0-100):
优秀!评级:A
良好!评级:B
中等!评级:C
及格!评级:D
不及格!评级:F
错误:成绩必须在 0-100 之间!
运行效果:
TEXT
📖 仅展示
请输入你的成绩(0-100):85
良好!评级:B
❓ 常见问题
Q 为什么 10 / 3 = 3 而不是 3.3333?
A 因为两个操作数都是整数,C++ 做整数除法(丢弃小数部分)。想要小数结果,至少把一个数改为浮点数:
10.0 / 3 或 10 / 3.0 就得到 3.33333。Q % 可以取负数的余数吗?
A 可以,但结果正负取决于被除数(C++11 标准)。建议只用
% 处理正整数,避免踩坑。例如 (-10) % 3 结果是 -1。Q 为什么不能写 5 < x < 10?
A 这是数学写法但 C++ 不支持。正确的写法是用逻辑与运算符连接两个条件:
if (5 < x && x < 10)。Q i++ 和 ++i 到底有什么区别?
A
i++(后置自增)先返回原值再加1;++i(前置自增)先加1再返回新值。对于 int 等基本类型二者性能无区别,但对于迭代器等自定义类型 ++i 可能更高效(无需保存原值)。建议:没有特殊需求时优先用 ++i。📖 小节
- C++ 有五大类运算符:算术、关系、逻辑、赋值、自增/自减
- 整数除法会丢弃小数部分,要得到小数结果至少要把一个操作数改成浮点数
- 别把
==写成=,否则会出大错 ++i是先加后用,i++是先用后加- 如果不确定运算符优先级,加括号!
- 逻辑运算符有短路特性,可以提高效率
📝 作业
- 基础题 (Difficulty ⭐): 编写一个程序,让用户输入两个整数,输出它们的和、差、积、商、余数。
TEXT
📖 仅展示
请输入第一个整数:10
请输入第二个整数:3
和:13
差:7
积:30
商:3
余数:1
- 进阶题 (Difficulty ⭐⭐): 编写一个程序,让用户输入一个三位数(如 365),程序分别输出它的百位、十位、个位。
TEXT
📖 仅展示
请输入一个三位数:365
百位:3
十位:6
个位:5
(提示:用 / 和 % 运算符)
- 挑战题 (Difficulty ⭐⭐⭐): 编写一个程序,实现"猜数字"游戏:
- 程序随机生成一个 1-100 的数字(提示:用
% 100 + 1可以把随机数变成 1-100) - 让用户输入猜测的数字
- 如果猜大了,提示"大了!"
- 如果猜小了,提示"小了!"
- 如果猜对了,提示"恭喜你,猜对了!"
- (进阶:统计用户猜了多少次)
- C++ 五大类运算符:算术、关系、逻辑、赋值、自增/自减
- 整数除法会丢弃小数部分,需把操作数转为浮点
- 关系运算符返回 bool 值,注意 == 和 = 的区别
- 逻辑运算符有短路特性
- 不确定优先级时加括号
9. 🚀 下一步
学会了运算符,接下来我们学习 条件判断(if-else)(第05课)—— 让程序能做决策,根据不同情况执行不同代码。