C++ 运算符优先级和关联性

在本教程中,我们将借助示例了解 C++ 中运算符的优先级和关联性。

C++ 运算符优先级

如果单个表达式中有多个运算符,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() {

  // 首先运算 17 * 6
  int num1 = 5 - 17 * 6;

  // 等同于 num1
  int num2 = 5 - (17 * 6);

  // 首先运算 5 - 17
  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 表示最低优先级的运算符。

C++ 运算符优先级表
C++ 运算符优先级表

C++ 运算符关联性

运算符关联性是计算表达式的方向。例如,

int a = 1;
int b = 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;

  b += a -= 6;

  cout << "a = " << a << endl; ;
  cout << "b = " << b;
}

输出

a = -5
b = -1