令人困惑的答案:一个说* myptr ++首先递增指针,另一个说* p ++取消引用旧指针值

时间:2013-04-29 14:57:41

标签: c pointers expression operator-precedence sequence-points

如果你为我澄清这一点,我将不胜感激。最近有两个问题及其接受的答案:

1) What is the difference between *myptr++ and *(myptr++) in C

2) Yet another sequence point query: how does *p++ = getchar() work?

第一个问题的接受答案,简明扼要,易于理解,因为++的优先级高于*,指针myptr的增量首先完成然后再进行被解除引用。我甚至在编译器上检查了它并验证了它。

但是之前几分钟接受的第二个问题的答案让我感到困惑。

它明确地说*p++严格地说p的旧地址被取消引用。我没有理由质疑第二个问题的最高答案的正确性,但坦率地说,我觉得它与用户H2CO3的第一个问题的答案相矛盾。所以任何人都能用简单明了的英语解释第二个问题是什么回答均值以及*p++如何在第二个问题中取消引用p的旧值。由于p具有更高的优先级,因此++应该首先递增?地球可以在*p++谢谢中取消引用旧地址。

3 个答案:

答案 0 :(得分:2)

后缀增量运算符确实具有higher precedence而不是解除引用运算符,但变量的后缀增量会在递增之前返回该变量的值。

*myptr++

因此增量操作具有更高的优先级,但是对增量返回的值进行解除引用,这是myptr的先前值。


你所链接的第一个问题的答案并没有错,他正在回答另一个问题。

*myptr++*(myptr++)之间没有区别,因为在这两种情况下,首先完成增量,然后取消引用之前的myptr值。

答案 1 :(得分:1)

  

第一个问题的接受答案,简明扼要,易于理解,因为++的优先级高于*

右。这是对的。

  

首先完成指针myptr的增量,然后取消引用。

它没有这么说。优先级决定了子表达式的分组,但不是评估的顺序。

++的优先级高于间接*的优先级,表示

*myptr++

完全相同(当然不是在源代码级别上)
*(myptr++)

这意味着间接应用于

的结果
myptr++

子表达式,myptr的旧值,而(*myptr)++会将增量运算符应用于myptr指向的值。

后缀增量的结果是操作数的旧值,所以

*myptr++ = something;

具有相同的效果
*myptr = something;
myptr++;

当未指定存储增加的myptr值的副作用时。它可能在评估间接之前发生,或者在此之后发生,这取决于编译器。

答案 2 :(得分:1)

C规范的6.5.2.4节讨论了后缀增量和减量运算符。那里的第二段几乎回答了你的问题:

  

postfix ++运算符的结果是操作数的值。作为副作用,   操作数对象的值递增(即,相应类型的值为1   添加到它)。   
...
  在副作用之前对结果的值计算进行排序   更新操作数的存储值。

所以给定*myptr++,是的,++部分具有更高的优先级;但优先权并不完全决定您的结果。该语言使用规范定义。在这种情况下,返回myptr的值,然后执行myptr递增的“副作用”。