相关疑难解决方法(0)

评估顺序和未定义的行为

在C++ 11标准的上下文中(不再有序列点的概念,如您所知),我想了解如何定义两个最简单的示例.

int i = 0;

i = i++;   // #0

i = ++i;   // #1
Run Code Online (Sandbox Code Playgroud)

SO上有两个主题可以解释C++ 11环境中的这些示例.这里据说#0调用UB并且#1定义明确.这里有人说,这两个例子是不确定的.这种模棱两可让我很困惑.我已经三次读过这个结构良好的参考文献,但这个主题似乎对我来说太复杂了.

.

让我们分析一下这个例子#0:i = i++;.

相应的报价是:

  • 内置后增量和后减量运算符的值计算在其副作用之前进行排序.

  • 内置赋值运算符和所有内置复合赋值运算符的副作用(左参数的修改)在左右参数的值计算(但不是副作用)之后排序,并在之前排序赋值表达式的值计算(即,在返回对修改对象的引用之前)

  • 如果相对于同一标量对象的另一个副作用,标量对象的副作用未被排序,则行为未定义.

当我得到它时,赋值运算符的副作用没有按其左右参数的副作用排序.因此,赋值运算符的副作用没有按副作用排序i++.所以#0调用一个UB.

.

让我们分析一下这个例子#1:i = ++i;.

相应的报价是:

  • 内置preincrement和predecrement运算符的副作用在其值计算之前被排序(由于定义为复合赋值的隐式规则)

  • 内置赋值运算符和所有内置复合赋值运算符的副作用(左参数的修改)在左右参数的值计算(但不是副作用)之后排序,并在之前排序赋值表达式的值计算(即,在返回对修改对象的引用之前)

  • 如果相对于同一标量对象的另一个副作用,标量对象的副作用未被排序,则行为未定义.

我看不出,这个例子是怎样的#0.对于我而言,这似乎是一个UB,原因与此相同#0.分配的副作用没有按照副作用排序++i.它似乎是一个UB.上面讨论的主题说它定义明确.为什么?

.

问题:如何应用引用规则来确定示例的UB.一个尽可能简单的解释将不胜感激.谢谢!

c++ increment sequence undefined-behavior c++11

18
推荐指数
2
解决办法
914
查看次数

标签 统计

c++ ×1

c++11 ×1

increment ×1

sequence ×1

undefined-behavior ×1