背景
今天刚和一个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)指向的值被分配给由intAPtrintgA[0])指向的位置;
指针intAPtrintBPtr递增。
这些事情发生的确切顺序未明;不能依赖于intBPtrintAPtr之后递增,反之亦然,也不能依赖于在递增之前发生的赋值,等等。
所以当这一切完成时,intgA[0] == 3intAPtr == &intgA[1]intBPtr == &intgB[1]
表达式的计算结果为增量前的值。

10-04 15:05