0

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

1) C 中 *myptr++ 和 *(myptr++) 有什么区别

2) 又一个序列点查询:*p++ = getchar() 是如何工作的?

第一个问题的公认答案简明易懂地指出,由于++优先级高于*,因此首先完成指针的增量myptr,然后取消引用。我什至在编译器上检查并验证了它。

但是几分钟前发布的第二个问题的公认答案让我感到困惑。

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

4

3 回答 3

2

后缀自增运算符确实比解引用运算符具有更高的优先级,但变量的后缀自增会在自增之前返回该变量的值。

*myptr++

因此,增量操作具有更高的优先级,但取消引用是在增量返回的值上完成的,该值是 的前一个值myptr


您链接到的第一个问题的答案没有错,他在回答另一个问题。

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

于 2013-04-29T15:07:17.447 回答
1

第一个问题的公认答案简明易懂地指出,since++的优先级高于*,

对。那是对的。

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

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

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

*myptr++

完全一样(当然不是在源代码级别)

*(myptr++)

这意味着间接应用于

myptr++

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

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

*myptr++ = something;

具有相同的效果

*myptr = something;
myptr++;

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

于 2013-04-29T15:06:48.890 回答
1

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

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

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

于 2013-04-29T15:37:35.960 回答