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. 关系运算符

关系运算符用来比较两个值,结果是 truefalse

(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

💡 记忆技巧:

(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 / 310 / 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

📖 小节


📝 作业

  1. 基础题 (Difficulty ⭐): 编写一个程序,让用户输入两个整数,输出它们的和、差、积、商、余数。
TEXT 📖 仅展示
请输入第一个整数:10
请输入第二个整数:3
和:13
差:7
积:30
商:3
余数:1
  1. 进阶题 (Difficulty ⭐⭐): 编写一个程序,让用户输入一个三位数(如 365),程序分别输出它的百位、十位、个位。
TEXT 📖 仅展示
请输入一个三位数:365
百位:3
十位:6
个位:5

(提示:用 /% 运算符)

  1. 挑战题 (Difficulty ⭐⭐⭐): 编写一个程序,实现"猜数字"游戏:
  2. 程序随机生成一个 1-100 的数字(提示:用 % 100 + 1 可以把随机数变成 1-100)
  3. 让用户输入猜测的数字
  4. 如果猜大了,提示"大了!"
  5. 如果猜小了,提示"小了!"
  6. 如果猜对了,提示"恭喜你,猜对了!"
  7. (进阶:统计用户猜了多少次)

9. 🚀 下一步

学会了运算符,接下来我们学习 条件判断(if-else)(第05课)—— 让程序能做决策,根据不同情况执行不同代码。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏