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

Unh*_*lig 15 c arrays pointers operator-precedence dereference

背景

今天刚和C人聊天,我们不同意以下几点:

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

int *intAPtr = intgA;
int *intBPtr = intgB;
Run Code Online (Sandbox Code Playgroud)

所以当我们这样做时:

*intAPtr++ = *intBPtr++;
Run Code Online (Sandbox Code Playgroud)

我的分析

第一:

intBPtr 增加1,现在指向地址5.然后,deference,保持值5;

intAPtr 也增加1,现在指向地址2.随后引用并且值为2;

最后:

2由5代替.

所以他们分别是:5和5.

他的分析

首先将值*intBPtr赋值为*intAPtrfirst.

因此,他们成为:3和3.

然后,两个*intAPtr*intBPtr递增一.

所以,他们分别成为:4和4.

我的假设

我认为++运营商优先双双超过*=,因此我断言.

例如,如果我们有:

*intAPtr++; 
Run Code Online (Sandbox Code Playgroud)

结果应该是2,对吗?因为我们首先递增指针然后取消引用.

那么为什么在上述情况下,正如他所声称的那样,我们首先将值赋值给最后intBPtr的值intAPtr并增加值?

在完成了所有建议后,我在IDE中运行了代码,结果证实了@sujin:

虽然它确认我至少在优先权方面是正确的:

那: *intAPtr++ = *intBPtr++;

intAPtr++具有更高的优先级,这导致:将intAPtr其地址递增1.

现在指向:地址2.

同样地:

intBPtr++ 也增加1(地址).

现在指向:地址5.

然后*轮到:

因此,两者分别取消引用(*)分别为2和5.

问题仍然存在,因为上面的(=)分配似乎没有发生.

如果它确实两者都会变成5.

期待进一步开悟.

Joh*_*ode 9

该声明

*intAPtr++ = *intBPtr++;
Run Code Online (Sandbox Code Playgroud)

被解析为

*(intAPtr++) = *(intBPtr++);
Run Code Online (Sandbox Code Playgroud)

并细分如下:

  • intBPtr(3)当前指向的值被分配给intAPtr(intgA[0])指向的位置;
  • 指针 intAPtrintBPtr递增.

这些事情发生的确切顺序是未指明的 ; 你不能依赖于intBPtr增量,intAPtr反之亦然,也不能依赖增量之前发生的任务等.

因此,通过的时间,这是全部完成,intgA[0] == 3intAPtr == &intgA[1]intBPtr == &intgB[1].

表达式a++计算为增量a 之前的值.

  • 对于`这些事情发生的确切顺序是未指定的'+1. (2认同)

hac*_*cks 5

你和另一个人都错了!

或者,
1.两个指针先递增然后分配发生或
2.一个指针递增,然后分配发生,然后另一个指针递增或
3.发生第一次分配,然后指针递增.

但规则是,在下一个语句开始之前,必须完成一个语句的所有副作用.请记住,必须使用原始值.只要使用原始值,增量就可以随时发生.

C-faq:3.2:

不能保证,一个增量或减量被放弃先前的值之后立即进行和表达的任何其他部分之前被评估.仅保证在表达式被认为"完成"之前的某个时间执行更新.

阅读Eric Lippert给出的答案,详细解释.