在cpprefernce.com的前缀增加示例中,有以下代码:
int n1 = 1;
...
int n3 = ++ ++n1;
为什么在这种情况下链式递增不会导致UB?在这种情况下最多不会违反一次修改的规则吗?
在C ++ 11和更高版本中,当有两个写操作或一个写操作和一个读操作未排序并访问相同的内存位置时,就会发生UB。但是++x
等价于x+=1
,所以++ ++n1
等价于(n1+=1)+=1
,在这里,由于赋值和复合赋值运算符的属性,读取和写入按照严格的顺序进行:首先n1
读取,然后写入一个加上原始值,然后得到的值是再次读取,然后将该值加一。
在C ++ 03中,这是UB,因为您提到了一条旧规则:两次修改之间没有序列点。但是在C ++ 11中,不再有任何序列点。相反,存在“先于顺序”的偏序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句