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

pbe*_*eta 4 c++ operator-precedence

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

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

在此输入图像描述

然而,我知道

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]
Run Code Online (Sandbox Code Playgroud)

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

Sto*_*ica 5

“优先”具有误导性。一般来说,它与求值顺序(先发生什么)关系不大,而是为了求值而确定每个运算符的操作数是什么。但让我们检查一下你的例子。

*(b++) = 5;
Run Code Online (Sandbox Code Playgroud)

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

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