为什么内置类型的链接前缀增量/减量不是C++的UB?

Sla*_*ica 8 c++ prefix-operator

在cpprefernce.com 前缀增量的示例中,有这样的代码:

int n1 = 1;
...
int n3 = ++ ++n1;
Run Code Online (Sandbox Code Playgroud)

为什么在这种情况下链式增量不会导致UB?在这种情况下,最多一次修改的规则是否违反?

Bri*_*ian 11

在C++ 11及更高版本中,当有两个写入或一个未被排序的写入和读取并访问相同的内存位置时,会发生UB.但是++x相当于x+=1,所以++ ++n1相当于(n1+=1)+=1,这里读取和写入由于赋值和复合赋值运算符的属性而在严格的序列中发生:首先n1读取,然后写入一个加上原始值,然后得到的值是再读一遍,然后再写一个值.

在C++ 03中,这 UB,因为您提到的旧规则:两个修改之间没有序列点.但是在C++ 11中,不再有任何序列点; 而是有"先前排序"的部分顺序.