Skip to content

2.2 运算符与表达式

运算符(Operator)是对数据进行操作的符号,表达式(Expression)是由变量、常量和运算符组合而成的计算式。C++ 提供了丰富的运算符,本节按类别逐一介绍。

用于基本的数学计算:

运算符含义示例结果
+加法5 + 38
-减法5 - 32
*乘法5 * 315
/除法5 / 31
%取余(模)5 % 32

关于除法需要特别注意:当两个操作数都是整数时,执行的是整数除法(Integer Division),结果会截断小数部分:

int a = 5 / 3; // 结果是 1,不是 1.666...
double b = 5.0 / 3; // 结果是 1.666...(其中一个操作数是浮点数)
double c = 5 / 3; // 结果是 1.0(先做整数除法得到 1,再转为 double)

取余运算符 % 只能用于整数类型,不能用于浮点数。

最基本的赋值运算符是 =,将右侧的值赋给左侧的变量:

int x = 10;
x = 20; // 将 x 的值更新为 20

C++ 还提供了复合赋值运算符,将算术运算与赋值合并:

运算符等价写法示例
+=x = x + yx += 5;
-=x = x - yx -= 3;
*=x = x * yx *= 2;
/=x = x / yx /= 4;
%=x = x % yx %= 3;

++-- 分别将变量的值加 1 和减 1。它们有前置后置两种形式:

int a = 5;
int b = ++a; // 前置自增:先将 a 加 1(a 变为 6),再将 a 的值赋给 b(b 为 6)
int c = a++; // 后置自增:先将 a 的值赋给 c(c 为 6),再将 a 加 1(a 变为 7)

在不需要使用表达式的值时(例如单独一行 i++;),前置和后置效果相同。但在表达式中使用时,需要注意求值顺序的差异。

{% hint style=“info” %} 对于内置类型,前置和后置的性能没有区别。但对于自定义类型(如迭代器),前置版本通常更高效,因为后置版本需要创建临时副本。养成优先使用前置形式的习惯是个好选择。 {% endhint %}

用于比较两个值,结果为 bool 类型(truefalse):

运算符含义示例结果
==等于5 == 3false
!=不等于5 != 3true
<小于5 < 3false
>大于5 > 3true
<=小于等于5 <= 5true
>=大于等于3 >= 5false

{% hint style=“warning” %} 注意区分赋值运算符 = 和相等比较运算符 ==。将 == 误写为 = 是初学者最常见的错误之一,而且编译器不一定会报错。 {% endhint %}

用于组合多个布尔表达式:

运算符含义示例结果
&&逻辑与(AND)true && falsefalse
||逻辑或(OR)true || falsetrue
!逻辑非(NOT)!truefalse

逻辑与和逻辑或具有短路求值(Short-circuit Evaluation)特性:

  • &&:如果左侧为 false,右侧不会被求值(因为结果必然是 false
  • ||:如果左侧为 true,右侧不会被求值(因为结果必然是 true
int x = 0;
if (x != 0 && 10 / x > 1) {
// 当 x 为 0 时,10 / x 不会被执行,避免了除零错误
}

直接操作数据的二进制位,主要用于底层编程和性能优化场景:

运算符含义示例结果
&按位与0b1010 & 0b11000b1000
|按位或0b1010 | 0b11000b1110
^按位异或0b1010 ^ 0b11000b0110
~按位取反~0b1010所有位翻转
<<左移1 << 38
>>右移16 >> 24

初学阶段不需要深入掌握位运算,但应了解它们的存在。左移 n 位相当于乘以 2^n,右移 n 位相当于除以 2^n。

当一个表达式中包含多个运算符时,C++ 按照优先级(Precedence)决定运算顺序。以下列出常用运算符的优先级(从高到低):

优先级运算符结合方向
1()左到右
2++ --(后置)、!~右到左
3* / %左到右
4+ -左到右
5<< >>左到右
6< <= > >=左到右
7== !=左到右
8&左到右
9^左到右
10|左到右
11&&左到右
12||左到右
13= += -=右到左

不必记住全部优先级。当不确定运算顺序时,使用括号明确优先级是最安全的做法:

// 不清楚优先级时,用括号消除歧义
int result = (a + b) * (c - d);
bool check = (x > 0) && (y < 10);