C++算术运算符 #
一、基本算术运算符 #
1.1 运算符列表 #
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
+ |
加法 | 5 + 3 |
8 |
- |
减法 | 5 - 3 |
2 |
* |
乘法 | 5 * 3 |
15 |
/ |
除法 | 5 / 3 |
1 |
% |
取余 | 5 % 3 |
2 |
1.2 基本使用 #
cpp
#include <iostream>
int main() {
int a = 10, b = 3;
std::cout << "加法: " << a + b << std::endl; // 13
std::cout << "减法: " << a - b << std::endl; // 7
std::cout << "乘法: " << a * b << std::endl; // 30
std::cout << "除法: " << a / b << std::endl; // 3
std::cout << "取余: " << a % b << std::endl; // 1
return 0;
}
二、除法运算 #
2.1 整数除法 #
cpp
// 整数除法:结果为整数,小数部分被截断
int a = 7 / 2; // 3
int b = 7 / 3; // 2
int c = -7 / 2; // -3(C++11起向零取整)
// 注意:整数除法不会四舍五入
int d = 9 / 10; // 0
2.2 浮点除法 #
cpp
// 浮点除法:结果为浮点数
double a = 7.0 / 2; // 3.5
double b = 7 / 2.0; // 3.5
double c = 7.0 / 2.0; // 3.5
// 混合运算:整数会被提升为浮点数
double d = 7.0 / 2; // 3.5(2被提升为double)
2.3 除以零 #
cpp
// 整数除以零:未定义行为
int a = 10 / 0; // 运行时错误
// 浮点除以零:返回无穷大或NaN
double b = 10.0 / 0.0; // inf(无穷大)
double c = 0.0 / 0.0; // nan(非数)
三、取余运算 #
3.1 基本用法 #
cpp
// 取余运算符:返回除法的余数
int a = 10 % 3; // 1
int b = 10 % 5; // 0
int c = 10 % 7; // 3
// 只能用于整数
// double d = 10.0 % 3.0; // 错误!
3.2 负数取余 #
cpp
// C++11起:结果符号与被除数相同
int a = 10 % 3; // 1
int b = -10 % 3; // -1
int c = 10 % -3; // 1
int d = -10 % -3; // -1
3.3 取余应用 #
cpp
// 判断奇偶
bool isEven(int n) {
return n % 2 == 0;
}
// 循环索引
int index = (index + 1) % size;
// 提取数字各位
int num = 12345;
int lastDigit = num % 10; // 5
int lastTwoDigits = num % 100; // 45
// 时间转换
int totalSeconds = 3725;
int hours = totalSeconds / 3600; // 1
int minutes = (totalSeconds % 3600) / 60; // 2
int seconds = totalSeconds % 60; // 5
四、自增自减运算符 #
4.1 前缀与后缀 #
cpp
int x = 5;
// 前缀:先运算,后使用
int a = ++x; // x = 6, a = 6
// 后缀:先使用,后运算
int b = x++; // b = 6, x = 7
// 自减同理
int c = --x; // x = 6, c = 6
int d = x--; // d = 6, x = 5
4.2 详细示例 #
cpp
#include <iostream>
int main() {
int x = 5;
// 前缀自增
std::cout << "++x: " << ++x << std::endl; // 6
std::cout << "x: " << x << std::endl; // 6
// 后缀自增
std::cout << "x++: " << x++ << std::endl; // 6
std::cout << "x: " << x << std::endl; // 7
// 前缀自减
std::cout << "--x: " << --x << std::endl; // 6
std::cout << "x: " << x << std::endl; // 6
// 后缀自减
std::cout << "x--: " << x-- << std::endl; // 6
std::cout << "x: " << x << std::endl; // 5
return 0;
}
4.3 复杂表达式中的使用 #
cpp
// 不推荐:复杂表达式中使用自增自减
int x = 5;
int y = x++ + ++x; // 未定义行为!
// 推荐:分开写
int x = 5;
x++;
int y = x + ++x; // 仍然不推荐
// 最佳实践:单独使用
int x = 5;
x++; // 推荐
int y = x + 1; // 推荐
4.4 迭代器中的自增 #
cpp
#include <vector>
std::vector<int> vec = {1, 2, 3, 4, 5};
// 前缀自增更高效(避免临时对象)
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << std::endl;
}
// 后缀自增也可以,但效率稍低
for (auto it = vec.begin(); it != vec.end(); it++) {
std::cout << *it << std::endl;
}
五、一元正负运算符 #
5.1 一元正号 #
cpp
int x = 5;
int y = +x; // 5(通常无实际效果)
// 用于强调正数
int positive = +10;
5.2 一元负号 #
cpp
int x = 5;
int y = -x; // -5
// 取反
int a = 10;
int b = -a; // -10
int c = -b; // 10
// 注意:-INT_MIN可能溢出
#include <climits>
int min = INT_MIN;
int neg = -min; // 未定义行为(32位int)
六、运算符优先级 #
6.1 算术运算符优先级 #
cpp
// 优先级:* / % > + -
int a = 2 + 3 * 4; // 14,不是20
int b = 10 - 6 / 2; // 7,不是2
// 使用括号改变优先级
int c = (2 + 3) * 4; // 20
int d = (10 - 6) / 2; // 2
6.2 优先级表 #
| 优先级 | 运算符 | 结合性 |
|---|---|---|
| 高 | ++ --(后缀) |
左到右 |
++ --(前缀)+ -(一元) |
右到左 | |
* / % |
左到右 | |
| 低 | + - |
左到右 |
6.3 复杂表达式 #
cpp
int a = 2, b = 3, c = 4, d = 5;
// 从左到右,考虑优先级
int result = a + b * c - d / a;
// 等价于:a + (b * c) - (d / a)
// = 2 + 12 - 2 = 12
// 使用括号使意图更清晰
int result2 = a + (b * c) - (d / a);
七、溢出问题 #
7.1 整数溢出 #
cpp
#include <climits>
int a = INT_MAX;
int b = a + 1; // 未定义行为(通常回绕到INT_MIN)
unsigned int c = UINT_MAX;
unsigned int d = c + 1; // 定义行为:0
// 检查溢出
int add(int a, int b) {
if (a > 0 && b > INT_MAX - a) {
// 溢出
}
if (a < 0 && b < INT_MIN - a) {
// 下溢
}
return a + b;
}
7.2 使用更大的类型 #
cpp
int a = 1000000;
int b = 1000000;
// 可能溢出
int c = a * b;
// 使用更大的类型
long long d = static_cast<long long>(a) * b;
八、数学函数 #
8.1 cmath库 #
cpp
#include <cmath>
// 幂函数
double a = pow(2, 3); // 8.0
double b = sqrt(16); // 4.0
double c = cbrt(27); // 3.0
// 绝对值
int d = abs(-5); // 5
double e = fabs(-3.14); // 3.14
// 取整
double f = floor(3.7); // 3.0(向下取整)
double g = ceil(3.2); // 4.0(向上取整)
double h = round(3.5); // 4.0(四舍五入)
double i = trunc(3.7); // 3.0(向零取整)
// 三角函数
double j = sin(3.14159 / 2); // 约1.0
double k = cos(0); // 1.0
double l = tan(0); // 0.0
// 对数
double m = log(2.71828); // 约1.0(自然对数)
double n = log10(100); // 2.0(常用对数)
double o = log2(8); // 3.0(以2为底)
九、最佳实践 #
9.1 避免整数除法陷阱 #
cpp
// 错误:整数除法
double avg = (a + b) / 2; // 如果a、b是int,结果也是int
// 正确:浮点除法
double avg = (a + b) / 2.0; // 或
double avg = static_cast<double>(a + b) / 2;
9.2 使用括号明确意图 #
cpp
// 不清晰
int result = a + b * c - d / e;
// 清晰
int result = a + (b * c) - (d / e);
9.3 避免复杂表达式中的自增自减 #
cpp
// 不推荐
int x = 5;
int y = x++ + ++x;
// 推荐
int x = 5;
x++;
int y = x + x;
x++;
9.4 检查除法 #
cpp
int safeDivide(int a, int b) {
if (b == 0) {
// 处理除零错误
return 0;
}
return a / b;
}
十、总结 #
算术运算符一览 #
| 运算符 | 说明 | 示例 |
|---|---|---|
+ |
加法 | a + b |
- |
减法 | a - b |
* |
乘法 | a * b |
/ |
除法 | a / b |
% |
取余 | a % b |
++ |
自增 | ++a, a++ |
-- |
自减 | --a, a-- |
+ |
一元正 | +a |
- |
一元负 | -a |
注意事项 #
- 整数除法截断小数部分
- 取余只能用于整数
- 前缀自增先运算后使用,后缀自增先使用后运算
- 注意整数溢出问题
- 避免除以零
下一步,让我们学习关系运算符!
最后更新:2026-03-26