C++ 运算符优先级和结合性

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
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战