运算符优先级的后缀增量

时间:2018-03-14 07:15:33

标签: c++ c operator-precedence

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

*(P ++);

因为postfix ++ increment运算符的优先级高于* dereference运算符。

但是现在我正在考虑运算符优先级,我发现postfix ++高于例如equality ==运算符,但是在:

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

同样的道理!逻辑NOT:

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

int a = 0;
if (inc(a) == 0)