C++ 运算符优先级
如果一个表达式中有多个运算符,这些运算不会同时进行。具有更高优先级的运算符的运算会先被评估。
让我们看一个例子
int x = 5 - 17 * 6;
这里,乘法运算符 *
的优先级高于减法运算符 -
。因此,17 * 6
会先被计算。
结果,上述表达式等同于
int x = 5 - (17 * 6);
如果我们想先计算 5 - 17
,那么必须将它们用括号括起来
int x = (5 - 17) * 6;
示例 1:运算符优先级
#include <iostream>
using namespace std;
int main() {
// evaluates 17 * 6 first
int num1 = 5 - 17 * 6;
// equivalent expression to num1
int num2 = 5 - (17 * 6);
// forcing compiler to evaluate 5 - 17 first
int num3 = (5 - 17) * 6;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
cout << "num3 = " << num3 << endl;
return 0;
}
输出
num1 = -97 num2 = -97 num3 = -72
注意:由于 C++ 中有很多运算符并且优先级级别不止一种,因此强烈建议使用括号来提高代码的可读性。
C++ 运算符优先级表
下表(摘自 cppreference.com)显示了 C++ 运算符的优先级。优先级级别 1 表示优先级最高的运算符,而优先级级别 17 表示优先级最低的运算符。
结合性属性将在稍后讨论。
优先级 | 运算符 | 描述 | 结合性 |
---|---|---|---|
1 | :: | 作用域解析 | 从左到右 |
2 | a++ a-- type( ) type{ } a( ) a[ ] . -> |
后缀/后置增量 后缀/后置减量 函数强制转换 函数强制转换 函数调用 下标 对象的成员访问 对象指针的成员访问 |
从左到右 |
3 | ++a --a +a -a ! ~ (type) *a &a sizeof co_await new new[ ] delete delete[] |
前缀增量 前缀减量 一元加 一元减号 逻辑非 按位非 C 风格强制转换 间接引用(解引用) 取地址 大小 await 表达式 动态内存分配 动态内存释放 |
从右到左 |
4 | .* ->* |
成员对象选择器 成员指针选择器 |
从左到右 |
5 | a * b a / b a % b |
乘法 除法 模 |
从左到右 |
6 | a + b a - b |
加法 减法 |
从左到右 |
7 | << >> |
按位左移 按位右移 |
从左到右 |
8 | <=> | 三向比较运算符 | 从左到右 |
9 | < <= > >= |
小于 小于或等于 大于 大于或等于 |
从左到右 |
10 | == != |
等于 不等于 |
从左到右 |
11 | & | 按位与 | 从左到右 |
12 | ^ | 按位异或 | 从左到右 |
13 | | | 按位或 | 从左到右 |
14 | && | 逻辑与 | 从左到右 |
15 | || | 逻辑或 | 从左到右 |
16 | a ? b : c throw co_yield = += -= *= /= %= <<= >>= &= ^= |= |
三元条件运算符 throw 运算符 yield 表达式 (C++ 20) 赋值 加法赋值 减法赋值 乘法赋值 除法赋值 取模赋值 按位左移赋值 按位右移赋值 按位与赋值 按位异或赋值 按位或赋值 |
从右到左 |
17 | , | 逗号运算符 | 从左到右 |
C++ 运算符结合性
运算符结合性是表达式的求值方向。例如,
int a = 1;
int b = 4;
// a will be 4
a = b;
以 a = 4;
语句为例。=
运算符的结合性是从右到左。因此,将 b 的值赋给了 a,而不是反向进行。
同样,多个运算符可能具有相同的优先级级别(如上表所示)。当表达式中使用多个相同优先级级别的运算符时,它们会根据其结合性进行求值。
int a = 1;
int b = 4;
b += a -= 6;
+=
和 -=
运算符具有相同的优先级。由于这些运算符的结合性是从右到左,因此最后一条语句的求值方式如下:
a -= 6
先被计算。因此,a 将为 -5- 然后,将计算
b += -5
。因此,b 将为 -1
示例 2:运算符结合性
#include <iostream>
using namespace std;
int main() {
int a = 1;
int b = 4;
// a -= 6 is evaluated first
b += a -= 6;
cout << "a = " << a << endl; ;
cout << "b = " << b;
}
输出
a = -5 b = -1