前言

C++作为一门强大的编程语言,其运算符系统非常丰富且功能强大。无论是简单的算术计算还是复杂的位操作,C++都提供了相应的运算符。本文将全面介绍C++中的各种运算符,通过实例和图示帮助您深入理解它们的工作原理和使用场景。

1. 算术运算符

算术运算符用于执行基本的数学运算。

1.1 基本算术运算符

#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 3;
    
    // 加法
    cout << "a + b = " << a + b << endl;  // 输出: 13
    
    // 减法
    cout << "a - b = " << a - b << endl;  // 输出: 7
    
    // 乘法
    cout << "a * b = " << a * b << endl;  // 输出: 30
    
    // 除法
    cout << "a / b = " << a / b << endl;  // 输出: 3 (整数除法)
    
    float c = 10.0, d = 3.0;
    cout << "c / d = " << c / d << endl;  // 输出: 3.33333 (浮点数除法)
    
    // 取模(求余数)
    cout << "a % b = " << a % b << endl;  // 输出: 1
    
    return 0;
}

1.2 自增和自减运算符

#include <iostream>
using namespace std;

int main() {
    int x = 5;
    
    // 后置自增
    cout << "x++: " << x++ << endl;  // 输出: 5,然后x变为6
    
    // 前置自增
    cout << "++x: " << ++x << endl;  // 输出: 7,x变为7
    
    int y = 10;
    
    // 后置自减
    cout << "y--: " << y-- << endl;  // 输出: 10,然后y变为9
    
    // 前置自减
    cout << "--y: " << --y << endl;  // 输出: 8,y变为8
    
    return 0;
}

自增/自减运算符的工作流程可以用以下图示表示:

前置
后置
开始自增/自减操作
判断前置还是后置?
先增加/减少值
使用新值
结束
保存原始值
增加/减少值
使用保存的原始值

2. 关系运算符

关系运算符用于比较两个值,返回布尔值(true或false)。

#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 20;
    
    cout << "a == b: " << (a == b) << endl;  // 输出: 0 (false)
    cout << "a != b: " << (a != b) << endl;  // 输出: 1 (true)
    cout << "a > b: " << (a > b) << endl;    // 输出: 0 (false)
    cout << "a < b: " << (a < b) << endl;    // 输出: 1 (true)
    cout << "a >= b: " << (a >= b) << endl;  // 输出: 0 (false)
    cout << "a <= b: " << (a <= b) << endl;  // 输出: 1 (true)
    
    return 0;
}

使用场景:条件语句、循环控制、排序算法中的比较等。

3. 逻辑运算符

逻辑运算符用于组合多个条件。

#include <iostream>
using namespace std;

int main() {
    bool x = true, y = false;
    
    // 逻辑与 (AND) - 两个操作数都为true时返回true
    cout << "x && y: " << (x && y) << endl;  // 输出: 0
    
    // 逻辑或 (OR) - 至少一个操作数为true时返回true
    cout << "x || y: " << (x || y) << endl;  // 输出: 1
    
    // 逻辑非 (NOT) - 反转操作数的逻辑状态
    cout << "!x: " << !x << endl;  // 输出: 0
    cout << "!y: " << !y << endl;  // 输出: 1
    
    // 短路求值示例
    int a = 5, b = 0;
    if (b != 0 && a / b > 2) {  // 由于b!=0为false,a/b不会执行,避免除零错误
        cout << "条件成立" << endl;
    } else {
        cout << "条件不成立" << endl;  // 输出: 条件不成立
    }
    
    return 0;
}

逻辑运算符的短路求值特性:

逻辑与
逻辑或
开始逻辑运算
运算符类型?
计算第一个操作数
第一个操作数为真?
计算第二个操作数
返回false
跳过第二个操作数
返回两个操作数的AND结果
计算第一个操作数
第一个操作数为假?
计算第二个操作数
返回true
跳过第二个操作数
返回两个操作数的OR结果
结束

4. 位运算符

位运算符直接操作数据的二进制位。

#include <iostream>
#include <bitset>
using namespace std;

int main() {
    unsigned int a = 5;  // 二进制: 0101
    unsigned int b = 3;  // 二进制: 0011
    
    // 按位与 (AND)
    cout << "a & b: " << (a & b) << endl;  // 输出: 1 (二进制: 0001)
    
    // 按位或 (OR)
    cout << "a | b: " << (a | b) << endl;  // 输出: 7 (二进制: 0111)
    
    // 按位异或 (XOR)
    cout << "a ^ b: " << (a ^ b) << endl;  // 输出: 6 (二进制: 0110)
    
    // 按位取反 (NOT)
    cout << "~a: " << (~a) << endl;  // 输出: 4294967290 (32位系统上)
    
    // 左移
    cout << "a << 1: " << (a << 1) << endl;  // 输出: 10 (二进制: 1010)
    
    // 右移
    cout << "a >> 1: " << (a >> 1) << endl;  // 输出: 2 (二进制: 0010)
    
    // 使用bitset显示二进制表示
    cout << "a的二进制: " << bitset<4>(a) << endl;
    cout << "b的二进制: " << bitset<4>(b) << endl;
    cout << "a&b的二进制: " << bitset<4>(a & b) << endl;
    
    return 0;
}

使用场景

  • 权限系统(使用位掩码)
  • 加密算法
  • 数据压缩
  • 硬件编程和底层优化

5. 赋值运算符

赋值运算符用于给变量赋值。

#include <iostream>
using namespace std;

int main() {
    int a = 10;
    
    // 简单赋值
    a = 5;
    cout << "a = 5: " << a << endl;
    
    // 复合赋值
    a += 3;  // 等价于 a = a + 3
    cout << "a += 3: " << a << endl;
    
    a -= 2;  // 等价于 a = a - 2
    cout << "a -= 2: " << a << endl;
    
    a *= 4;  // 等价于 a = a * 4
    cout << "a *= 4: " << a << endl;
    
    a /= 2;  // 等价于 a = a / 2
    cout << "a /= 2: " << a << endl;
    
    a %= 3;  // 等价于 a = a % 3
    cout << "a %= 3: " << a << endl;
    
    // 位运算复合赋值
    int b = 5;  // 二进制: 0101
    b &= 3;     // 二进制: 0011, 结果: 0001 (1)
    cout << "b &= 3: " << b << endl;
    
    b = 5;
    b |= 3;     // 结果: 0111 (7)
    cout << "b |= 3: " << b << endl;
    
    b = 5;
    b ^= 3;     // 结果: 0110 (6)
    cout << "b ^= 3: " << b << endl;
    
    b = 5;
    b <<= 1;    // 结果: 1010 (10)
    cout << "b <<= 1: " << b << endl;
    
    b = 5;
    b >>= 1;    // 结果: 0010 (2)
    cout << "b >>= 1: " << b << endl;
    
    return 0;
}

6. 其他运算符

6.1 条件运算符(三元运算符)

#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 20;
    
    // 条件运算符: 条件 ? 表达式1 : 表达式2
    int max = (a > b) ? a : b;
    cout << "最大值: " << max << endl;
    
    // 嵌套条件运算符
    int score = 85;
    char grade = (score >= 90) ? 'A' : 
                 (score >= 80) ? 'B' : 
                 (score >= 70) ? 'C' : 
                 (score >= 60) ? 'D' : 'F';
    cout << "等级: " << grade << endl;
    
    return 0;
}

6.2 逗号运算符

#include <iostream>
using namespace std;

int main() {
    // 逗号运算符会按顺序计算所有表达式,并返回最后一个表达式的值
    int a = (1, 2, 3, 4, 5);
    cout << "a = " << a << endl;  // 输出: 5
    
    int x = 10, y = 20, z;
    z = (x += 5, y += 10, x + y);
    cout << "x = " << x << ", y = " << y << ", z = " << z << endl;
    // 输出: x = 15, y = 30, z = 45
    
    // 在for循环中的常见用法
    for (int i = 0, j = 10; i < j; i++, j--) {
        cout << "i = " << i << ", j = " << j << endl;
    }
    
    return 0;
}

6.3 sizeof运算符

#include <iostream>
using namespace std;

int main() {
    int arr[10];
    double d;
    char c;
    
    cout << "int大小: " << sizeof(int) << " 字节" << endl;
    cout << "double大小: " << sizeof(d) << " 字节" << endl;
    cout << "char大小: " << sizeof(c) << " 字节" << endl;
    cout << "数组大小: " << sizeof(arr) << " 字节" << endl;
    cout << "数组元素个数: " << sizeof(arr) / sizeof(arr[0]) << endl;
    
    return 0;
}

6.4 类型转换运算符

#include <iostream>
using namespace std;

int main() {
    // C风格类型转换
    double pi = 3.14159;
    int intPi = (int)pi;
    cout << "C风格转换: " << intPi << endl;
    
    // C++静态类型转换
    intPi = static_cast<int>(pi);
    cout << "static_cast: " << intPi << endl;
    
    // 常量转换
    const int constant = 10;
    int& nonConst = const_cast<int&>(constant);
    nonConst = 20;
    cout << "const_cast: " << nonConst << endl;
    
    // 重新解释转换(慎用)
    int num = 65;
    char* charPtr = reinterpret_cast<char*>(&num);
    cout << "reinterpret_cast: " << *charPtr << endl;  // 输出: A (ASCII 65)
    
    return 0;
}

7. 运算符优先级和结合性

运算符优先级决定了表达式中运算的执行顺序。以下是从高到低的主要优先级顺序:

  1. 作用域解析(:😃
  2. 成员访问(., ->)、下标([])、函数调用(())
  3. 后缀自增/自减(++、–)
  4. 前缀自增/自减(++、–)、类型转换、sizeof、取地址(&)、解引用(*)、逻辑非(!)、按位取反(~)
  5. 成员指针(., ->)
  6. 乘(*)、除(/)、取模(%)
  7. 加(+)、减(-)
  8. 左移(<<)、右移(>>)
  9. 关系运算符(<, <=, >, >=)
  10. 相等(==)、不等(!=)
  11. 按位与(&)
  12. 按位异或(^)
  13. 按位或(|)
  14. 逻辑与(&&)
  15. 逻辑或(||)
  16. 条件运算符(?😃
  17. 赋值运算符(=, +=, -=等)
  18. 逗号运算符(,)
#include <iostream>
using namespace std;

int main() {
    int a = 5, b = 10, c = 15;
    
    // 由于乘法的优先级高于加法,所以先计算b * c
    int result1 = a + b * c;
    cout << "a + b * c = " << result1 << endl;  // 输出: 155
    
    // 使用括号改变优先级
    int result2 = (a + b) * c;
    cout << "(a + b) * c = " << result2 << endl;  // 输出: 225
    
    return 0;
}

结语

C++的运算符系统非常强大,掌握它们对于编写高效、简洁的代码至关重要。本文涵盖了C++中大多数重要的运算符,并通过示例说明了它们的用法。在实际编程中,建议:

  1. 使用括号明确表达式的计算顺序,避免依赖优先级记忆
  2. 谨慎使用自增/自减运算符,特别是在复杂表达式中
  3. 理解短路求值特性,编写更高效的逻辑表达式
  4. 对于位运算,确保理解其二进制工作原理
  5. 优先使用C++风格的类型转换,它们更安全且更易于维护

希望本文能帮助您更好地理解和应用C++中的各种运算符!

更多推荐