考虑以下表达式(带有说明的声明):

int n = 42;
--n &= 0x01;

这是否违反了排序规则?

在我看来,作为左侧操作数的“值计算”的一部分,需要预增量。如果这是真的,那么自 C++11 起就没有 UB(并且,自 C++17 起,值计算和副作用都相对于赋值进行排序)。

如果它是一个后增量,那么 n 的修改只是一个副作用,我们不会有很好的排序(直到 C++17)。

最佳答案

我想你是对的,这是标准所说的:
8.5.18 赋值和复合赋值运算符

所以从上面看,赋值似乎是值表达式,赋值的左右两边都在赋值之前进行评估。
从关于预增量的标准:
8.5.2.2 增减

这意味着即使在 C++17 之前,它的副作用也会在值计算之前排序。

关于c++ - 写入新值是预增量表达式的 "value computation"的一部分,还是 "side effect"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58502699/

10-13 08:28