背景
今天我和一个C语言专家聊天,我们对以下问题持不同意见:
int intgA[2] = { 1, 2 };
int intgB[2] = { 3, 5 };
int *intAPtr = intgA;
int *intBPtr = intgB;
因此,当我们执行以下操作时:
*intAPtr++ = *intBPtr++;
我的分析
首先:
intBPtr
增加了一,现在指向地址为5的位置。然后对其进行解引用,得到值5。
intAPtr
也增加了一,现在指向地址为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。
期待进一步的启示。