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

注意事项 #

  1. 整数除法截断小数部分
  2. 取余只能用于整数
  3. 前缀自增先运算后使用,后缀自增先使用后运算
  4. 注意整数溢出问题
  5. 避免除以零

下一步,让我们学习关系运算符!

最后更新:2026-03-26