取消引用和后缀的优先级
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操作符,它的返回值是p
before递增。
@CarlNorum 我明白了,按顺序发生了 3 件事:1.取消引用 2.复制分配 3.增加。谢谢
@wwwjieo0: p
直到“稍后”才会递增 - 这意味着最迟在下一条语句之前,但不在像这样的同一表达式中。以上是关于取消引用和后缀的优先级的主要内容,如果未能解决你的问题,请参考以下文章