背景
今天刚和一个C的人聊天,我们在以下问题上有分歧:

int intgA[2] = { 1, 2 };
int intgB[2] = { 3, 5 };

int *intAPtr = intgA;
int *intBPtr = intgB;

所以当我们这样做的时候:
*intAPtr++ = *intBPtr++;

我的分析
第一:
intBPtr
递增1,现在指向5的地址。
然后,恭敬地,保持值5;
intAPtr
也递增1,现在指向2的地址。
随后引用,值为2;
最后:
2替换为5。
它们分别是:5和5。
他的分析
*intBPtr
的值首先分配给
*intAPtr

因此,它们变成:3和3。
然后
*intAPtr
*intBPtr
都增加一。
所以,它们分别变成:4和4。
我的假设
我认为
++
运算符优先于
*
=
,因此我断言。
例如,如果我们有:
*intAPtr++; 

结果应该是2,对吧?因为我们首先递增指针,然后取消引用。
那么,为什么在上面的例子中,正如他所说,我们首先将
intBPtr
的值赋给
intAPtr
的值,然后最后增加值呢?
在采纳了这里的所有建议之后,我在ide中运行了代码,结果证实了@sujin:
尽管它证实了我至少在优先权方面是正确的:
那:
*intAPtr++ = *intBPtr++;

intAPtr++
具有更高的优先级,这导致:
intAPtr
将其地址增加1。
现在指向:2的地址。
同样地:
intBPtr++
也递增1(地址)。
现在指向:地址5。
然后轮到
*
了:
所以两者分别被解引用到2和5。
但问题仍然存在,因为上面的分配(
=
)似乎没有发生。
如果是这样的话,两者都会变成5。
期待被进一步启发。

最佳答案:

声明

*intAPtr++ = *intBPtr++;

被解析为
*(intAPtr++) = *(intBPtr++);

分解如下:
当前由
intBPtr
(3)指向的值被分配给由
intAPtr
intgA[0]
)指向的位置;
指针
intAPtr
intBPtr
递增。
这些事情发生的确切顺序未明;不能依赖于
intBPtr
intAPtr
之后递增,反之亦然,也不能依赖于在递增之前发生的赋值,等等。
所以当这一切完成时,
intgA[0] == 3
intAPtr == &intgA[1]
intBPtr == &intgB[1]

表达式的计算结果为增量前的值。