C++ 运算符
运算符是C++中用于执行特定操作的符号。无论是简单的数学计算、变量赋值,还是复杂的条件判断,运算符都扮演着至关重要的角色。本文将全面介绍C++中的各类运算符,帮助初学者掌握这一基础而重要的概念。
运算符概述
C++提供了丰富的运算符类型,按功能可分为以下几类:
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 其他运算符(如条件运算符、sizeof、逗号运算符等)
算术运算符
算术运算符用于执行数学运算,包括:
运算符 | 描述 | 示例 |
---|---|---|
+ | 加法 | a + b |
- | 减法 | a - b |
* | 乘法 | a * b |
/ | 除法 | a / b |
% | 取模(余数) | a % b |
++ | 自增 | ++a 或 a++ |
-- | 自减 | --a 或 a-- |
使用示例
cpp
#include <iostream>
using namespace std;
int main() {
int a = 10, b = 3;
cout << "a + b = " << (a + b) << endl; // 输出: a + b = 13
cout << "a - b = " << (a - b) << endl; // 输出: a - b = 7
cout << "a * b = " << (a * b) << endl; // 输出: a * b = 30
cout << "a / b = " << (a / b) << endl; // 输出: a / b = 3 (整数除法)
cout << "a % b = " << (a % b) << endl; // 输出: a % b = 1 (余数)
int c = a++; // 后缀自增:先使用a的值,再自增
cout << "c = " << c << ", a = " << a << endl; // 输出: c = 10, a = 11
int d = ++b; // 前缀自增:先自增,再使用b的值
cout << "d = " << d << ", b = " << b << endl; // 输出: d = 4, b = 4
return 0;
}
注意
整数除法会截断小数部分,如果需要保留小数,至少有一个操作数应为浮点类型。
赋值运算符
赋值运算符用于给变量赋值:
运算符 | 描述 | 示例 |
---|---|---|
= | 简单赋值 | a = b |
+= | 加后赋值 | a += b 等价于 a = a + b |
-= | 减后赋值 | a -= b 等价于 a = a - b |
*= | 乘后赋值 | a *= b 等价于 a = a * b |
/= | 除后赋值 | a /= b 等价于 a = a / b |
%= | 取模后赋值 | a %= b 等价于 a = a % b |
<<= | 左移后赋值 | a <<= b 等价于 a = a << b |
>>= | 右移后赋值 | a >>= b 等价于 a = a >> b |
&= | 按位与后赋值 | a &= b 等价于 a = a & b |
^= | 按位异或后赋值 | a ^= b 等价于 a = a ^ b |
|= | 按位或后赋值 | a |= b 等价于 a = a | b |
使用示例
cpp
#include <iostream>
using namespace std;
int main() {
int a = 10;
a += 5; // a = a + 5
cout << "a += 5: " << a << endl; // 输出: a += 5: 15
a -= 3; // a = a - 3
cout << "a -= 3: " << a << endl; // 输出: a -= 3: 12
a *= 2; // a = a * 2
cout << "a *= 2: " << a << endl; // 输出: a *= 2: 24
a /= 4; // a = a / 4
cout << "a /= 4: " << a << endl; // 输出: a /= 4: 6
a %= 4; // a = a % 4
cout << "a %= 4: " << a << endl; // 输出: a %= 4: 2
return 0;
}
比较运算符
比较运算符用于比较两个值,返回布尔结果(true或false):
运算符 | 描述 | 示例 |
---|---|---|
== | 相等 | a == b |
!= | 不相等 | a != b |
> | 大于 | a > b |
< | 小于 | a < b |
>= | 大于等于 | a >= b |
<= | 小于等于 | a <= b |
使用示例
cpp
#include <iostream>
using namespace std;
int main() {
int a = 10, b = 20;
cout << "a == b 是 " << (a == b) << endl; // 输出: a == b 是 0 (false)
cout << "a != b 是 " << (a != b) << endl; // 输出: a != b 是 1 (true)
cout << "a > b 是 " << (a > b) << endl; // 输出: a > b 是 0 (false)
cout << "a < b 是 " << (a < b) << endl; // 输出: a < b 是 1 (true)
cout << "a >= b 是 " << (a >= b) << endl; // 输出: a >= b 是 0 (false)
cout << "a <= b 是 " << (a <= b) << endl; // 输出: a <= b 是 1 (true)
return 0;
}
逻辑运算符
逻辑运算符用于组合条件表达式:
运算符 | 描述 | 示例 |
---|---|---|
&& | 逻辑与 | a && b |
|| | 逻辑或 | a || b |
! | 逻辑非 | !a |
使用示例
cpp
#include <iostream>
using namespace std;
int main() {
bool a = true, b = false;
cout << "a && b 是 " << (a && b) << endl; // 输出: a && b 是 0 (false)
cout << "a || b 是 " << (a || b) << endl; // 输出: a || b 是 1 (true)
cout << "!a 是 " << (!a) << endl; // 输出: !a 是 0 (false)
// 复合条件示例
int age = 25;
bool hasLicense = true;
if (age >= 18 && hasLicense) {
cout << "可以合法驾驶" << endl; // 会输出
}
return 0;
}
短路求值
C++中的逻辑运算符具有短路求值特性:
- 对于
&&
,如果第一个条件为 false,则不会评估第二个条件 - 对于
||
,如果第一个条件为 true,则不会评估第二个条件
位运算符
位运算符对整数的二进制位进行操作:
运算符 | 描述 | 示例 |
---|---|---|
& | 按位与 | a & b |
| | 按位或 | a | b |
^ | 按位异或 | a ^ b |
~ | 按位取反 | ~a |
<< | 左移 | a << n |
>> | 右移 | a >> n |
使用示例
cpp
#include <iostream>
using namespace std;
int main() {
unsigned int a = 60; // 二进制: 00111100
unsigned int b = 13; // 二进制: 00001101
cout << "a & b = " << (a & b) << endl; // 输出: a & b = 12 (00001100)
cout << "a | b = " << (a | b) << endl; // 输出: a | b = 61 (00111101)
cout << "a ^ b = " << (a ^ b) << endl; // 输出: a ^ b = 49 (00110001)
cout << "~a = " << (~a) << endl; // 输出: ~a = -61 (取决于整数表示)
cout << "a << 2 = " << (a << 2) << endl; // 输出: a << 2 = 240 (11110000)
cout << "a >> 2 = " << (a >> 2) << endl; // 输出: a >> 2 = 15 (00001111)
return 0;
}
其他重要运算符
条件运算符(三元运算符)
格式:条件表达式 ? 表达式1 : 表达式2
如果条件为真,则计算并返回表达式1的值;否则,计算并返回表达式2的值。
cpp
#include <iostream>
using namespace std;
int main() {
int age = 20;
string status = (age >= 18) ? "成年" : "未成年";
cout << "状态: " << status << endl; // 输出: 状态: 成年
// 可以嵌套使用,但可能影响可读性
int score = 85;
char grade = (score >= 90) ? 'A' : ((score >= 80) ? 'B' : ((score >= 70) ? 'C' : 'D'));
cout << "分数: " << score << ", 等级: " << grade << endl; // 输出: 分数: 85, 等级: B
return 0;
}
sizeof 运算符
sizeof
返回变量或数据类型的字节大小:
cpp
#include <iostream>
using namespace std;
int main() {
cout << "int 的大小: " << sizeof(int) << " 字节" << endl;
int arr[10];
cout << "int 数组的大小: " << sizeof(arr) << " 字节" << endl;
cout << "数组元素个数: " << sizeof(arr) / sizeof(arr[0]) << endl;
return 0;
}
逗号运算符
逗号运算符允许在一个表达式中包含多个子表达式,从左到右计算每个表达式,并返回最右边表达式的值:
cpp
#include <iostream>
using namespace std;
int main() {
int a = 10, b = 20, c;
// 逗号运算符示例
c = (a++, b++, a + b);
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
// 输出: a = 11, b = 21, c = 32
return 0;
}
运算符优先级与结合性
C++中的运算符具有不同的优先级和结合性。优先级决定了表达式中的计算顺序,而结合性决定了相同优先级运算符的计算方向。
以下是部分运算符的优先级(从高到低):
- 作用域解析运算符
::
- 后缀自增自减
a++
a--
- 前缀自增自减
++a
--a
、一元运算符+
-
!
~
、sizeof
- 乘除模
*
/
%
- 加减
+
-
- 移位
<<
>>
- 关系运算符
<
<=
>
>=
- 相等运算符
==
!=
- 按位与
&
- 按位异或
^
- 按位或
|
- 逻辑与
&&
- 逻辑或
||
- 条件运算符
?:
- 赋值运算符
=
+=
-=
等 - 逗号运算符
,
注意
在不确定运算符优先级的情况下,建议使用括号明确表达式的计算顺序,这样可以提高代码可读性并避免潜在错误。
实际应用案例
案例1:简易计算器
cpp
#include <iostream>
using namespace std;
int main() {
double num1, num2, result;
char op;
cout << "简易计算器" << endl;
cout << "请输入第一个数: ";
cin >> num1;
cout << "请输入操作符 (+, -, *, /): ";
cin >> op;
cout << "请输入第二个数: ";
cin >> num2;
switch(op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if(num2 != 0) {
result = num1 / num2;
} else {
cout << "错误: 除数不能为零!" << endl;
return 1;
}
break;
default:
cout << "错误: 无效的运算符!" << endl;
return 1;
}
cout << num1 << " " << op << " " << num2 << " = " << result << endl;
return 0;
}
案例2:位操作实现简单的权限系统
cpp
#include <iostream>
using namespace std;
// 权限常量
#define READ_PERMISSION 0x1 // 0001
#define WRITE_PERMISSION 0x2 // 0010
#define EXECUTE_PERMISSION 0x4 // 0100
#define ADMIN_PERMISSION 0x8 // 1000
void printPermissions(unsigned char permissions) {
cout << "权限: ";
if(permissions & READ_PERMISSION) cout << "读 ";
if(permissions & WRITE_PERMISSION) cout << "写 ";
if(permissions & EXECUTE_PERMISSION) cout << "执行 ";
if(permissions & ADMIN_PERMISSION) cout << "管理员 ";
cout << endl;
}
int main() {
unsigned char userPermissions = 0;
// 授予读和写权限
userPermissions |= READ_PERMISSION;
userPermissions |= WRITE_PERMISSION;
printPermissions(userPermissions); // 输出: 权限: 读 写
// 授予执行权限
userPermissions |= EXECUTE_PERMISSION;
printPermissions(userPermissions); // 输出: 权限: 读 写 执行
// 检查是否有管理员权限
if(userPermissions & ADMIN_PERMISSION) {
cout << "用户有管理员权限" << endl;
} else {
cout << "用户没有管理员权限" << endl;
}
// 移除写权限
userPermissions &= ~WRITE_PERMISSION;
printPermissions(userPermissions); // 输出: 权限: 读 执行
// 切换执行权限
userPermissions ^= EXECUTE_PERMISSION;
printPermissions(userPermissions); // 输出: 权限: 读
// 切换回执行权限
userPermissions ^= EXECUTE_PERMISSION;
printPermissions(userPermissions); // 输出: 权限: 读 执行
return 0;
}
总结
本文全面介绍了C++中的各类运算符:
- 算术运算符用于数学计算,如加减乘除和取模等
- 赋值运算符用于给变量赋值,包括简单赋值和复合赋值
- 比较运算符用于比较两个值,返回布尔结果
- 逻辑运算符用于组合和操作布尔条件
- 位运算符对整数的二进制位进行操作,常用于底层编程
- 其他运算符如条件运算符、sizeof和逗号运算符等
理解和正确使用这些运算符对于编写高效、准确的C++程序至关重要。在使用复杂表达式时,可适当使用括号明确计算顺序,提高代码的可读性和可维护性。
练习题
为了加深理解,尝试完成以下练习:
- 编写一个程序,使用位运算符将一个整数乘以2和除以2
- 使用条件运算符编写一个程序,找出三个数中的最大值
- 实现一个温度转换程序,根据用户的选择,使用算术运算符在摄氏度和华氏度之间转换
- 编写一个程序,使用逻辑运算符验证用户年龄是否在18到60之间
- 使用位运算符编写一个程序,计算一个整数中二进制位1的个数
学习资源
- 《C++ Primer》- 提供了对C++运算符的详细解释
- C++ 参考手册 - 在线资源,包含运算符的完整参考
- GeeksforGeeks C++ 运算符 - 提供额外的示例和解释
掌握C++运算符为学习更复杂的编程概念奠定了坚实基础。继续练习和实践这些运算符的使用,将会逐渐提升你的C++编程能力!