双重分配的评估顺序

时间:2013-06-24 13:31:34

标签: c++

我在代码库中发现了一些内容,即使它从未失败过,但对我来说看起来并不合适。

我已经将代码修剪成类似于链表的东西(数据结构比这复杂得多)。

Node * node = firstNode();

while( moreNodesAwaiting() )
{
    Node * newnode = giveMeAnotherNode();

    node = node->next = newnode ; // <-- This is what I don't like.
}

我不确定此处是否适用未定义的行为。我们正在修改数据结构和序列点之间的指针,但这与修改值两次不同。

此外,如果编译器可以按任何顺序评估表达式的元素,是否意味着它可以在分配之前评估 node-&gt; next

以防万一,我已将其更改为:

    node->next = newnode ;
    node = node->next    ;

这也强调了我们遍历列表的事实。

1 个答案:

答案 0 :(得分:14)

作业从右到左关联。换句话说:

a = b = c;

被解析为

a = (b = c);

这个顺序由标准保证。

也就是说,对于原始类型,它会将c分配到ba。对于非原始类型,它将调用a.operator= (b.operator= (c))