我偶然发现了https://en.cppreference.com/w/cpp/language/operator_precedence
在图表上,我看到后增量运算符(++)高于赋值运算符(=)。但是,我知道
int a […
“优先权”具有误导性。它一般没有什么可做的 评估顺序 (先发生什么),而是为了评估而确定每个运算符的操作数。但让我们来看看你的例子。
*(b++) = 5;
这意味着 5 将被分配到左侧的左值。从C ++ 17开始,我们就知道了 5 完全评估之前 *(b++) 。在此之前,可以按任何顺序评估它们。
5
*(b++)
现在, b++ 具有“增量”的含义 b ,但要评估它 以前 价值“。所以 b++ 可能会导致增量发生在分配发生之前,是的,但是值的 (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