【问题标题】:Operator precedence Confusion运算符优先级混淆
【发布时间】:2015-02-09 05:08:30
【问题描述】:

经过href=http://en.cppreference.com/w/c/language/operator_precedence这个链接后,大家好, 我以为我理解了运算符的优先级,但我遇到了以下疑问。 该链接说 在解析表达式时,列在某行上的运算符将比其下一行中列出的任何运算符更紧密地绑定到其参数(就像用括号一样)。例如,表达式 *p++ 被解析为 *(p++),而不是 (*p)++。
那么表达式 ++*p 是如何被评估的,它就像 ++(*p) 但如果是 ++ 具有更高的优先级或绑定然后 *,那么为什么在上述情况下 * 绑定得更紧密,以及表达式呢*++p ?

【问题讨论】:

  • 对于++*p,您将如何以其他方式放置括号? ++ 必须适用于*p 而不是p,因为它物理上位于*p 的左侧,而不是p。当您编写 1 + 2*3 时,您不会期望 1 和 2 相乘,即使 * 的绑定比 + 更紧密。
  • 回答你的第二个问题,*++p 等同于*(++p)。在这里,也没有需要诉诸运算符优先级来解决的歧义。
  • *++p 必须被解释为*(++p),因为(*++)p 没有意义——* 的操作数必须是一个值,而不是一个运算符。

标签: c++ c pointers operator-precedence


【解决方案1】:

运算符优先级定义当有多个选择时应首先应用哪个运算符

来自您的链接:

优先级和关联性独立于order of evaluation

表达式++*p,或任何形式的表达式:

{operator 2} {operator 1} {expression}

有一个明确定义的order of evaluation,其中{operator 1} {expression} 必须被应用,以便生成{operator 2} 可以作用的表达式。

【讨论】:

    【解决方案2】:

    是的,++ 的优先级高于 *,两者的关联性是从右到左。

    所以

    ++*p 将被评估为++(*p),因为++ 需要应用于可修改的值。

    *++p 正如您在评估时看到的那样,接近 p 的运算符是 ++ 并且比 * 具有更高的优先级,因此 ++p 将首先发生,然后是取消引用 *(++p)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多