取消引用和后缀的优先级

Posted

技术标签:

【中文标题】取消引用和后缀的优先级【英文标题】:Precedence of dereference and postfix 【发布时间】:2013-02-27 00:45:27 【问题描述】:

当我阅读 K&R 的 TCPL 时,我只是无法理解两种表达方式:

*p++ = val;  /*push val onto stack */

这是我的想法:

取消引用和后缀具有相同的优先级,并且关联性是从右到左的,所以

*p++ = val可能和*(p++) = val一样,因为指针通常是到顶部的下一个位置,所以在这段代码中,p因为括号先加1,所以p是当前上面的两个单位顶部,但不是当前顶部上方的一个单位,val 应该在哪里!!!谢谢

【问题讨论】:

post-fix 运算符的优先级高于取消引用*,所以它是先执行的:en.wikipedia.org/wiki/… 和p++ 将返回当前值进行取消引用,而不是增量值。 简而言之,*p++ = val 的意思是:1) 将p 引用的变量设置为val 2) 然后递增指针p 【参考方案1】:

K&R 中运算符的优先级和关联性,表 2-1,第 53 页, 不如 Stroustrup, tC++PL,Sed, sec 6.2 Operator summary, p120-121 中的最新表格那样精细和完整。

C++ operator precedence 阿格纽的回答很好。

他指出关联对于一元运算符和 *(p++) 确实是 R->L,

    第一个 p++ 求值,但前一个 p 值返回 然后 *p 使用之前的 p 值进行评估并进行分配 然后语句结束,p++ 后自增值现在处于活动状态,即指针 p 现在被碰撞。

【讨论】:

【参考方案2】:

运算符的优先级是编译器对它们的解释顺序,而不是它们的执行顺序。

运算符优先级实际上意味着“在哪里放置括号”。因此,您认为*p++*(p++) 相同是正确的。 但是现在我们需要了解什么是*(p++)。就是先取*p再增加p++,因为是后置操作。

因此,简而言之,您只需混合编译器的解释顺序(由括号或优先级决定)和执行顺序(由后置或前置定义决定)。

【讨论】:

【参考方案3】:

前缀递增/递减和解引用运算符的优先级相等,但后缀运算符更高,所以*p++*(p++)一样,就像写*p = val; p++;

如果您写了(*p)++ = val,它将无法编译,因为您会尝试为数字赋值。

【讨论】:

但是 p++ 可能因为括号而首先执行,所以 p++ 应该在取消引用之前。不是吗? @wwwjieo0,++确实先走。但是由于它是一个post-increment操作符,它的返回值是pbefore递增。 @CarlNorum 我明白了,按顺序发生了 3 件事:1.取消引用 2.复制分配 3.增加。谢谢 @wwwjieo0: p 直到“稍后”才会递增 - 这意味着最迟在下一条语句之前,但不在像这样的同一表达式中。

以上是关于取消引用和后缀的优先级的主要内容,如果未能解决你的问题,请参考以下文章

后缀表达式

P1449 后缀表达式

第三周——后缀表达式

[题解]P1449 后缀表达式

洛谷 P1449 后缀表达式

复习题之后缀表达式