提问人:Ibrahim Khalil 提问时间:8/14/2020 最后编辑:JorengarenarIbrahim Khalil 更新时间:8/14/2020 访问量:197
增量运算符优先级 [duplicate]
Increment operator precedence [duplicate]
问:
当我说
int a = 0;
int b = 1;
a = b++; // a=1 then b=2
为什么会这样?
赋值运算符的优先级低于递增和递减。那为什么会这样呢?
如果我说:
a = b+1; // a=2
在这种情况下,先执行,然后分配值。为什么前者没有发生这种情况?+
答:
这与运算符优先级无关。后缀 ++ 运算符被简单地指定为在内部以这种方式运行,C11 6.5.2.4:
结果的值计算在副作用之前进行排序 更新操作数的存储值。
这意味着首先计算为 1,此值由表达式的其余部分使用,并且 ++ 保证在此之后发生。b++
你(部分)是对的。赋值运算符的优先级确实低于后缀运算符。但是,您不正确的地方就是后缀运算符的意思。
根据 C11 规范第 6.5.2.4 节:
后缀 ++ 运算符的结果是操作数的值。作为副作用,操作数对象的值递增(即,将相应类型的值 1 添加到其中)。有关约束、类型和转换以及运算对指针的影响的信息,请参阅加法运算符和复合赋值的讨论。结果的值计算在更新操作数的存储值的副作用之前进行排序。
该规范非常清楚此运算符的语义。它解析为操作数的原始值,并且作为后来的副作用,其值增加。
如果要在示例中递增 both 和 的值,请使用前缀运算符,该运算符保证在赋值之前递增值。
但是,请记住,在单个表达式中对同一变量同时使用后缀和前缀运算符是未定义的行为。别这样!a
b
优先级来自语言的语法。它告诉我们如何解释该语句,粗略地说,您可以将其视为表达式的隐含括号。
因此,优先级均值被视为 而不是 。在这种情况下,另一个括号没有用,但在其他情况下,不同的括号可能有意义,例如 相比。a=b++
a=(b++)
(a=b)++
a & (b ^ c)
(a & b) ^ c
请注意,优先级(和关联性)与运行时的计算顺序以及运算符的含义无关。
在您的特定实例中,运算符的含义是给出操作数的值,然后作为后置条件,递增该操作数。因此被分配了 的值,并单独递增。++
a
b
b
评论
++
+1