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}
*(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}