gpt4 book ai didi

c - C 中的指针操作和运算符优先级

转载 作者:太空狗 更新时间:2023-10-29 16:33:46 25 4
gpt4 key购买 nike

背景

今天刚刚和一个 C 的家伙聊天,我们在以下方面存在分歧:

int intgA[2] = { 1, 2 };
int intgB[2] = { 3, 5 };

int *intAPtr = intgA;
int *intBPtr = intgB;

所以当我们这样做时:

*intAPtr++ = *intBPtr++;

我的分析

首先:

intBPtr 递增 1,现在指向地址 5。然后,deference,持有值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]);
  • 指针 intAPtrintBPtr 递增。

这些事情发生的确切顺序是未指定;你不能依赖 intBPtrintAPtr 之后递增,反之亦然,你也不能依赖在递增之前发生的赋值,等等。

所以当这一切都完成时,intgA[0] == 3intAPtr == &intgA[1]intBPtr == &intgB[ 1]

表达式 a++ 的计算结果为 a 增量之前的值。

关于c - C 中的指针操作和运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20957018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com