背景
今天刚和一个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]。表达式的计算结果为增量前的值。