【问题标题】:Operator precedence of postfix increment后缀增量的运算符优先级
【发布时间】:2018-08-22 15:01:18
【问题描述】:

我犯了一个愚蠢的错误 *p++;认为 p 将首先被取消引用,然后 p 指向的值会增加。所以我发现这更类似于:

*(p++);

因为后缀 ++ 自增运算符的优先级高于 * 解引用运算符。

但是现在我在考虑运算符优先级,我发现 postfix++ 比例如相等 == 运算符要高,但是在:

int a = 0;
if (0 == a++) // Condition is true

同样的道理!逻辑非:

int a = 0;
if (!a++) // Condition is true, a is incremented after the condition check
          // even if it's higher precedence than !

所以我所看到的肯定还有更多。

我听说过从右到左和顺时针/螺旋规则,但每次我试图掌握它时,我都无法理解。

我不想要对评估顺序的完整解释,因为我可以通过自己的阅读来解决这个问题。但我至少是对的,这不仅仅是运算符优先级的问题吗?例如,*p++ 被评估的方式是因为 postfix++ 运算符具有更高优先级的答案只有一半正确或部分答案?

Link to answer

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/9255147/…
  • 后缀 ++ 增加变量,但返回旧值。这就是后缀++ 的全部意义所在。
  • C 和 C++ 中的“优先级”是词法的。 “之前执行”不是您应该查阅优先级表的内容。
  • “运算符优先级”和“计算顺序”是完全不同的东西。
  • 作为@n.m。说,优先级和顺序是不同的东西。优先级定义在f(1)+g(2)*h(7) 中,从f() 调用返回的值将被添加到g()h() 值的乘积中,而评估顺序定义(或有时不定义)f()、@ 中的哪一个987654332@和h()可以先执行,后执行。

标签: c++ c operator-precedence


【解决方案1】:

您的声明,条件为真,a 在条件检查后递增,即使它的优先级高于 !,这是错误的。
在条件检查之后,a 没有必要增加。它可以随时发生。唯一可以确定的是,在表达式 !a++ 中,a 的旧值将用于 ! 运算符。
运算符优先级将有助于对操作数进行分组。 !a++ 中的操作数将被分组为 ! (a++)。这种分组并不意味着a 将在! 运算符应用于a++ 的结果之前递增。

【讨论】:

    【解决方案2】:

    p++ 表示增加 p 并返回它的原始值,它必须在任何其他使用它的值的运算符之前进行评估。如果您将增量视为一个函数,它可能更容易理解:

    int inc(int& v)
    {
      int value = v;
      v++;
      return value;
    }
    
    int a = 0;
    if (inc(a) == 0)
    

    【讨论】:

    • “它必须在任何其他使用其值的运算符之前进行评估” - 你能澄清你的意思吗?你和“评估”捆绑了什么?
    • @StoryTeller 通过评估我的意思是执行一个语句并确定它的价值?
    • 没有语句,只有带有副作用的表达式。如果您暗示副作用在某种程度上也是“原子”评估的一部分,那么您的答案是错误的。
    猜你喜欢
    • 2021-10-20
    • 2021-10-25
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2011-08-30
    • 2019-11-06
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多