C ++运算符优先级表中的后增量与赋值

问题描述 投票:2回答:2

我偶然发现了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}

c++ operator-precedence
2个回答
2
投票

“优先权”具有误导性。它通常与评估顺序(首先发生的事情)无关,而是为了评估而确定每个运算符的操作数。但让我们来看看你的例子。

*(b++) = 5;

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

现在,b++具有“增加b,但评估其先前值”的含义。所以b++可能会导致增量发生在赋值发生之前,是的,但是(b++)的值是增量发生之前的地址。这就是为什么b更新为指向下一个元素,同时在一个表达式中修改当前元素。


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
© www.soinside.com 2019 - 2024. All rights reserved.