考虑以下表达式(带有说明的声明):
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/