C ++操作优先级表中的后增量与赋值

时间:2019-03-10 08:43:29

标签: c++ operator-precedence

我偶然发现了https://en.cppreference.com/w/cpp/language/operator_precedence

在图表上,我看到后递增运算符(++)远高于赋值运算符(=)。

enter image description here

但是,我知道

int a[] = {10,20};
int* b = &a[0];

*(b++) = 5;

cout << a[0] << endl; // 5
cout << a[1] << endl; // 20
cout << *b << endl; // 20, now points to a[1]

我总是认为后递增发生在赋值运算符之后。但是,如果我遵循操作优先级图表,那么是否不应该在=操作之前进行后递增操作?答案不应该是a={10, 5}而不是a={5, 20}吗?

3 个答案:

答案 0 :(得分:2)

“优先级”具有误导性。通常,它与求值顺序(首先发生的事)无关,而是确定每个运算符的操作数是什么,以便进行求值。但是,让我们检查一下您的示例。

*(b++) = 5;

这意味着5将分配给左侧的左值。从C ++ 17开始,我们知道5的评估完全在*(b++)之前。在此之前,可以按任何顺序对其进行评估。

现在,b++的含义是“递增b,但要求出其上一个值”。因此,b++可能导致增量在分配发生之前发生,是的,但是(b++)的值是增量发生之前的地址。这就是为什么b在一个表达式中更新为指向下一个元素,同时修改当前元素的原因。

答案 1 :(得分:1)

后递增(b++)递增b然后返回前一个值b

预递增(++b)递增b然后返回新值b

要获得所需的行为,请从增量递增更改为增量递增。

例如:

#include <iostream>

int main() {
  int a[] = {10, 20};
  int *b = &a[0];

  *(++b) = 5;

  std::cout << a[0] << std::endl;
  std::cout << a[1] << std::endl;
  std::cout << *b << std::endl;
}

产生以下输出:

10
5
5

答案 2 :(得分:0)

表格是正确的。结果没有混淆。 请记住,后增(PI)或自减(DI),在包含 PI 或 DI 的当前语句后执行 +1 或 -1 更新。

*(b++) = 5;

第一个 b++ 将首先发生,因为它在括号中。但是 b 还没有继续下一步。因为编译器总是在后期操作中记住它会在当前语句之后执行它。所以它就像:

*b = 5; // a[0]=5;编译器记住了 b=b+1;执行。

所以现在 b = b+1;

因此 b 现在指向 a[1];