【发布时间】:2014-01-24 06:33:20
【问题描述】:
背景
今天刚和一个 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。
期待进一步开悟。
【问题讨论】:
-
intAPtr++是一个后增量。增量操作很可能发生在分配之后最后。您是否尝试过将此代码放入 IDE 并运行它,看看它做了什么? -
指针的增量何时发生与赋值无关。后增量的返回值是一个新的临时对象,与正在递增的指针分开。
-
@Cubbi:只需运行代码就可以验证行为需要 5 分钟。
标签: c arrays pointers dereference operator-precedence