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