我做了* 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 ++运算符具有更高的优先级只是答案的一半或部分答案?
答案 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)