我偶然发现了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]
我总是认为在赋值运算符之后发生了后增量。但是,如果我按照操作优先级图表,那么在=
操作之前是不是会发生后期增量?答案不是a={10, 5}
而不是a={5, 20}
?
“优先权”具有误导性。它通常与评估顺序(首先发生的事情)无关,而是为了评估而确定每个运算符的操作数。但让我们来看看你的例子。
*(b++) = 5;
这意味着将5
分配给左侧的左值。从C ++ 17开始,我们知道5
完全在*(b++)
之前进行评估。在此之前,可以按任何顺序评估它们。
现在,b++
具有“增加b
,但评估其先前值”的含义。所以b++
可能会导致增量发生在赋值发生之前,是的,但是(b++)
的值是增量发生之前的地址。这就是为什么b
更新为指向下一个元素,同时在一个表达式中修改当前元素。
后增量(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