9

我在我们的代码库中发现了一些东西,即使它从未失败过,对我来说看起来也不“正确”。

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

Node * node = firstNode();

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

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

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

此外,如果编译器可以以任何顺序评估表达式的元素,这是否意味着它可以在赋值发生之前评估node->next ?

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

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

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

4

1 回答 1

14

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

a = b = c;

被解析为

a = (b = c);

并且这个顺序是由标准来保证的。

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

于 2013-06-24T13:34:59.353 回答