【问题标题】: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

标签: c operators operator-precedence


【解决方案1】:

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

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

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

  1. 第一个 p++ 求值,但前一个 p 值返回
  2. 然后 *p 使用之前的 p 值进行评估并进行分配
  3. 然后语句结束,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 直到“稍后”才会递增 - 这意味着最迟在下一条语句之前,但不在像这样的同一表达式中。
      猜你喜欢
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 2014-11-03
      • 2018-08-22
      • 2021-10-25
      • 2017-12-25
      相关资源
      最近更新 更多