跳到主要内容

C++ 运算符

运算符是C++中用于执行特定操作的符号。无论是简单的数学计算、变量赋值,还是复杂的条件判断,运算符都扮演着至关重要的角色。本文将全面介绍C++中的各类运算符,帮助初学者掌握这一基础而重要的概念。

运算符概述

C++提供了丰富的运算符类型,按功能可分为以下几类:

  1. 算术运算符
  2. 赋值运算符
  3. 比较运算符
  4. 逻辑运算符
  5. 位运算符
  6. 其他运算符(如条件运算符、sizeof、逗号运算符等)

算术运算符

算术运算符用于执行数学运算,包括:

运算符描述示例
+加法a + b
-减法a - b
*乘法a * b
/除法a / b
%取模(余数)a % b
++自增++aa++
--自减--aa--

使用示例

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++中的运算符具有不同的优先级和结合性。优先级决定了表达式中的计算顺序,而结合性决定了相同优先级运算符的计算方向。

以下是部分运算符的优先级(从高到低):

  1. 作用域解析运算符 ::
  2. 后缀自增自减 a++ a--
  3. 前缀自增自减 ++a --a、一元运算符 + - ! ~sizeof
  4. 乘除模 * / %
  5. 加减 + -
  6. 移位 << >>
  7. 关系运算符 < <= > >=
  8. 相等运算符 == !=
  9. 按位与 &
  10. 按位异或 ^
  11. 按位或 |
  12. 逻辑与 &&
  13. 逻辑或 ||
  14. 条件运算符 ?:
  15. 赋值运算符 = += -=
  16. 逗号运算符 ,
注意

在不确定运算符优先级的情况下,建议使用括号明确表达式的计算顺序,这样可以提高代码可读性并避免潜在错误。

实际应用案例

案例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++中的各类运算符:

  1. 算术运算符用于数学计算,如加减乘除和取模等
  2. 赋值运算符用于给变量赋值,包括简单赋值和复合赋值
  3. 比较运算符用于比较两个值,返回布尔结果
  4. 逻辑运算符用于组合和操作布尔条件
  5. 位运算符对整数的二进制位进行操作,常用于底层编程
  6. 其他运算符如条件运算符、sizeof和逗号运算符等

理解和正确使用这些运算符对于编写高效、准确的C++程序至关重要。在使用复杂表达式时,可适当使用括号明确计算顺序,提高代码的可读性和可维护性。

练习题

为了加深理解,尝试完成以下练习:

  1. 编写一个程序,使用位运算符将一个整数乘以2和除以2
  2. 使用条件运算符编写一个程序,找出三个数中的最大值
  3. 实现一个温度转换程序,根据用户的选择,使用算术运算符在摄氏度和华氏度之间转换
  4. 编写一个程序,使用逻辑运算符验证用户年龄是否在18到60之间
  5. 使用位运算符编写一个程序,计算一个整数中二进制位1的个数

学习资源

掌握C++运算符为学习更复杂的编程概念奠定了坚实基础。继续练习和实践这些运算符的使用,将会逐渐提升你的C++编程能力!