C++ 提供了丰富多彩的运算符,涵盖算术运算、关系运算(比较运算)、逻辑运算、赋值运算等等多个类别,下面分类进行介绍说明。
1、算术运算
假设a的值未10,b的值为4
加法 + int c = a + b; 数值相加,结果为14
减法 - int c = a - b; 数值相减,结果为6
乘法 * int c = a * b; 数值相乘,结果为40
除法 / float c = a / b; 数值相除(这里a和b应该被定义未float类型),结果为2.5
整除 / int c = a / b; 整数除法会截断小数部分,只取值整数部分,结果为2
求余 % int c = a % b; 取模(余数),仅适用于整数,结果符号与被除数相同,结果为2
除(普通除法)与整除的区别:
普通除法 (真实除法)
当至少有一个操作数是浮点类型(float/double)时,则执行普通除法
double a = 10.0 / 4; // 2.5 (浮点结果)
float b = 10 / 4.0f; // 2.5f
double c = 10.0 / 4.0; // 2.5
特点:
保留完整的小数部分;结果更精确;适用于需要精确计算的场景
整除 (整数除法)
当两个操作数都是整数类型时,执行整除
int d = 10 / 4; // 2 (不是2.5)
int e = -10 / 3; // -3 (向零截断)
int f = 10 / 3; // 3 (截断小数部分)
特点:
丢弃小数部分(不是四舍五入);向零截断(正数向下取整,负数向上取整);计算速度快于浮点除法
2、关系运算:大于、大于等于、小于、小于等于、等于、不等于
关系运算符用于比较两个值,比较结果返回 true(1)或 false(0)。它们是逻辑控制和条件判断的基础。
运算符 含义 示例 返回值规则
大于 5 > 3 左操作数大,返回 true
= 大于或等于 5 >= 5 左操作数≥右操作数,返回 true
< 小于 3 < 5 左操作数小,返回 true
<= 小于或等于 5 <= 5 左操作数≤右操作数,返回 true
== 等于 5 == 5 值相等,返回 true
!= 不等于 5 != 3 值不等,返回 true
3、逻辑运算:与(&&)、或()、非(!)
逻辑运算符用于组合或修改布尔表达式,是构建复杂条件判断的基础。C++ 提供了三种基本逻辑运算符。
逻辑与 (&&)
作用:当且仅当所有操作数均为 true 时,结果为 true;否则为 false。
特性:如果第一个操作数为 false,不会计算第二个操作数。
语法:表达式1 && 表达式2
举例说明:
bool a = true, b = false;
bool result = a && b; // false(因为 b 为 false)
逻辑或 (||)
作用:只要有一个操作数为 true,结果即为 true;只要当全为 false 时,结果为 false。
特性:如果第一个操作数为 true,不会计算第二个操作数。
语法:表达式1 || 表达式2
举例说明:
bool a = true, b = false;
bool result = a || b; // true(因为 a 为 true)
逻辑非 (!)
作用:对布尔值取反(true 变 false,false 变 true)。
语法:!表达式
举例说明:
bool a = false;
bool result = !a; // true(因为 a 被取反)
运算符优先级:
! > && > ||
逻辑非 ! 的优先级高于所有的关系运算符
逻辑运算布尔转换:
在C++ 中,任何非零值被视为 true;零值被视为 false
4、变量自增与自减运算
自增(++)和自减(–)是 C++ 中用于对变量进行加 1 或 减 1 操作的一元运算符。它们有两种形式:
前缀形式(++x) 和 后缀形式(x++),两者的行为有重要区别(计算顺序不同)。
前缀形式(++x/–x):先修改变量X的值,然后再使用变量X
int x = 5;
int y = ++x; // x先变成 6,然后 y = 6
后缀形式(x++/x–):先使用X的原值,然后再修改变量X的值
int x = 5;
int y = x++; // y = 5,然后 x 变成 6
5、三目运算
定义:是 C++ 中唯一的需要 3 个操作数的运算符,属于条件运算符。
一般形式:条件表达式 ? 表达式1 : 表达式2
执行逻辑:
若条件表达式 为真(非零),则返回 表达式1 的值;否则返回 表达式2 的值。
例如:
#include
int main() {
int a = 10, b = 20;
int max = (a > b) ? a : b; // 取a和b中的较大值
cout << "较大值: " << max ; // 输出 20
return 0;
}
三目运算的嵌套使用
可以嵌套,但可能降低可读性,请谨慎使用
例如:
以下代码实现,根据分数所在的区间给出成绩的等级(A、B、C、D)
int score = 85;
char grade = (score >= 90) ? ‘A’ :
(score >= 80) ? ‘B’ :
(score >= 60) ? ‘C’ : ‘D’;
替代方案:以上也可以改用 if-else if 或 switch 结构实现。
6、位运算
定义
位运算(Bitwise Operations)是指直接对整数的二进制位进行操作,常用于底层编程、性能优化和某些特定算法(如加密、压缩、位掩码等)。
-
按位与 (&)
功能:两个操作数的对应二进制位均为 1 时,结果位才为 1,否则为 0。
即:0&0等于0,0&1等于0,1&0等于0,1&1等于1。
用途:掩码操作、清除特定位(那位清零就和0按位与,那位保留就和1按位与)。
举例说明:
int a = 5; // 5转换为二进制: 0101
int b = 3; // 3转换为二进制: 0011
int c = a & b; // 结果: 0001 (十进制 1) -
按位或 |
功能:两个操作数的对应二进制位有一个为 1 时,结果位为 1。
即:0| 0等于0,0| 1等于1,1| 0等于1,1| 1等于1。
用途:设置特定位(那位设置为1,就和1按位或)。
举例说明:
int a = 5; // 5转换为二进制:0101
int b = 3; // 3转换为二进制:0011
int c = a | b; // 0111 (十进制 7) -
按位非 ~
功能:对操作数的每一位取反(0 变 1,1 变 0)。
注意:结果依赖整数类型位数(如 ~int(0) 在 32 位系统为 0xFFFFFFFF)。
举例说明:
int a = 5; // 0000…0101
int b = ~a; // 1111…1010 (补码表示,十进制 -6) -
按位异或 ^
功能:两个操作数的对应二进制位不相同的时候,结果位为 1,否则为 0。
即:0 ^ 0等于0,0 ^ 1等于1,1 ^ 0等于1,1^1等于0。
特性:
任何数异或自身结果为 0(a ^ a = 0)。
支持交换变量(无需临时变量):
int x = 10, y = 20;
x = x ^ y;
y = x ^ y;
x = x ^ y; // 交换后 x=20, y=10
举例说明:
int a = 5; // 0101
int b = 3; // 0011
int c = a ^ b; // 0110 (十进制 6) -
左移 <<
功能:将操作数的二进制位向左移动指定位数,低位补 0。
数学意义:等价于乘以 2的n次方(无溢出时)。
举例说明:
int a = 5; // 0101
int b = a << 2; // 010100 (十进制 20) -
右移 >>
功能:将操作数的二进制位向右移动指定位数。
注意:
有符号数:高位补符号位(算术右移)。
无符号数:高位补 0(逻辑右移)。
举例说明:
int a = 20; // 010100
int b = a >> 2; // 000101 (十进制 5)
位运算的常见应用场景
快速判断奇偶:
bool isOdd = (num & 1); // 末位为1则是奇数
掩码操作:
const int MASK = 0xFF; // 保留低8位: value & MASK
权限控制:
enum Permissions { READ = 1, WRITE = 2, EXEC = 4 };
int userPerm = READ | WRITE; // 组合权限
优化计算:
int powerOfTwo = 1 << n; // 计算2^n
注意事项
符号位问题:右移有符号数时需谨慎(可能引发未定义行为)。
可读性:过度使用位运算会降低代码可读性,建议加注释。
性能:现代编译器会自动优化乘除为位运算(如 x*2 → x<<1)。