单个语句中的多个复合赋值:是否为未定义行为?

mak*_*fun 11 c++ undefined-behavior c++11

我无法找到明确的答案:以下代码是否有未定义的行为?

int x = 2;
x+=x+=x+=2.5;
Run Code Online (Sandbox Code Playgroud)

int*_*jay 14

行为未定义.让我们看一下稍微简单的表达式:

x += (x+=1)
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,左边x的值计算相对于表达式的值计算是无序的(x+=1).这意味着x相对于x(由于x+=1)的赋值,值计算是未序列的,因此行为是未定义的.

这样做的原因是运算+=符两侧的值计算相对于彼此是不确定的(因为标准没有另外指定).并且1.9p15州:

如果对标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义.

在C++ 03中,行为是未定义的,因为x在没有插入序列点的情况下修改了两次.

  • 注意:如果`x`是一个对象,用户定义的`operator + =`,那么它将被定义...... (2认同)