C++ 03和C++ 11之间未定义行为的区别是什么?

Dav*_*ley 18 c++ undefined-behavior c++11 c++03

新标准具有与旧标准不同的未定义行为.例如,新的排序规则意味着现在定义了一些过去未定义的算术运算(出于诸如序列点之间的多次写入的原因).

那么,我们需要重新学习未定义的行为?

650*_*502 14

在我看来,新规则的描述和理解更加复杂.例如,考虑:

int x = 12;
x = x++ + 1; // undefined behaviour
x = ++x + 1; // valid
Run Code Online (Sandbox Code Playgroud)

我建议简单地避免对同一个表达式中的同一个变量的多个副作用,这个规则更容易理解.AFAIK C++ 0X改变了一些过去未定义行为的案例,现在是合法用途(例如上面两个表达式中的第二个),但请记住,合法和什么之间总会有区别是道德的;-) ......没有人强迫你使用这些东西.

实际上,在上述情况下,第二个表达的有效性似乎无意中作为修复该语言中另一个问题(#222)的副作用.决定是使表达式有效,因为认为将某些内容从UB更改为明确定义不会造成任何伤害.然而,我认为虽然这并没有对程序造成任何损害(当然UB是最糟糕的问题),但它实际上对语言本身造成了一些损害......改变了一个已经很复杂的规则来解释和理解一个更加模糊的人.

IMO C++正在继续从C语言自然演变成一种语言,在这种语言中,一堆漂亮漂亮的逻辑语句可以做出精彩的事情......而另一堆同样好看,同样美观且同样合乎逻辑的语句可以使你的计算机爆炸而不是.

  • 这是否意味着"++++++++++++++++++++++ (3认同)
  • 从什么时候看起来很漂亮或合乎逻辑?C++丑陋的语义源于C中的设计错误,甚至是核心C++中的更糟糕的错误.这不是演变:类型系统从一开始就搞砸了.现在,有些人正试图修复其本质上存在缺陷的后果现在变得更加明显. (2认同)