新标准与旧标准具有不同的未定义行为。例如,新的排序规则意味着一些以前未定义的算术运算(由于序列点之间的多次写入等原因)现在被定义了。
那么,对于未定义的行为,我们需要重新学习什么?
最佳答案
在我看来,新规则更难描述和理解。例如考虑:
int x = 12;
x = x++ + 1; // undefined behaviour
x = ++x + 1; // valid
我建议在同一个表达式中简单地避免对同一个变量产生多个副作用,这是一个更易于理解的规则。 AFAIK C++0X 改变了一些过去未定义行为而现在合法使用的情况(例如上面两个表达式中的第二个),但请记住,什么是合法的和什么是有区别的是道德的;-) ...没有人强制你使用这些东西。
实际上,在上述情况下,第二个表达式的有效性似乎是无意中发生的,是修复语言中另一个问题 (#222) 的副作用。决定是使表达式有效,因为人们认为将某些内容从 UB 更改为明确定义不会造成任何伤害。然而,我认为虽然这并没有对程序造成任何损害(当然 UB 是最糟糕的问题),但它实际上对语言本身造成了一些损害......改变了一个已经很难解释和理解的规则一个更晦涩的。
IMO C++ 正在继续其从 C 的自然演变,成为一种语言,在该语言中,一堆好看、漂亮且合乎逻辑的语句可以做很棒的事情……而其中另一组同样好看、同样漂亮和同样合乎逻辑的语句反而会让你的电脑爆炸。
关于c++ - C++03 和 C++11 之间的未定义行为有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4379581/