C++运算符详解:从基础到高级全面解析
·
前言
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;
}
逻辑运算符的短路求值特性:
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. 运算符优先级和结合性
运算符优先级决定了表达式中运算的执行顺序。以下是从高到低的主要优先级顺序:
- 作用域解析(:😃
- 成员访问(., ->)、下标([])、函数调用(())
- 后缀自增/自减(++、–)
- 前缀自增/自减(++、–)、类型转换、sizeof、取地址(&)、解引用(*)、逻辑非(!)、按位取反(~)
- 成员指针(., ->)
- 乘(*)、除(/)、取模(%)
- 加(+)、减(-)
- 左移(<<)、右移(>>)
- 关系运算符(<, <=, >, >=)
- 相等(==)、不等(!=)
- 按位与(&)
- 按位异或(^)
- 按位或(|)
- 逻辑与(&&)
- 逻辑或(||)
- 条件运算符(?😃
- 赋值运算符(=, +=, -=等)
- 逗号运算符(,)
#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++中大多数重要的运算符,并通过示例说明了它们的用法。在实际编程中,建议:
- 使用括号明确表达式的计算顺序,避免依赖优先级记忆
- 谨慎使用自增/自减运算符,特别是在复杂表达式中
- 理解短路求值特性,编写更高效的逻辑表达式
- 对于位运算,确保理解其二进制工作原理
- 优先使用C++风格的类型转换,它们更安全且更易于维护
希望本文能帮助您更好地理解和应用C++中的各种运算符!
更多推荐


所有评论(0)