Pre/Post C++ 中的增量指针

Pre/Post Increment Pointers in C++

*(p1++)

int array[10] = {1,2};
int *p1 = array;
*p1=24;
*p1= *(p1++);
for (int i : array)
    cout << i << " ";

输出为 24 24

*(++p1)

int array[10] = {1,2};
int *p1 = array;
*p1=24;
*p1= *(++p1);
for (int i : array)
    cout << i << " ";

输出为 24 2

这似乎与用值递增完全相反。有人可以解释这里发生了什么吗?谢谢!

*p1= *(p1++);

这根本说不通。此操作的语义不同,具体取决于首先评估 = 的哪一侧。所以你无法理解它。

中存在未定义的行为
*p1 = *(p1++);

因为,引用 §1.9/15:

If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.

这里的副作用是 p1 的增量,值计算是使用 p1.

计算地址

所以你不应该依赖你的例子的确切结果。

对于 *(p1++):

*p1 = *(p1++)

p1++ 将递增 p1 以指向数组中的索引 1,并且 return 是 p1 的前一个值(索引 0)。所以 *(p1++) 将 return 24,而 *p1 现在等于 2。然后 *p1 被分配 return 值 (24),因此数组将是 {24,24}.

对于 *(++p1):

*p1 = *(++p1)

++p1 将递增 p1 以指向数组中的索引 2,并且 return 是 p1(索引 1)的当前值。所以 *(++p1) 将 return 2,而 *p1 现在将等于 2。然后 *p1 被分配 return 值 (2),这是原始值p1 (1) 的索引,所以数组将保持 {24,2}