我在代码库中发现了一些内容,即使它从未失败过,但对我来说看起来并不合适。
我已经将代码修剪成类似于链表的东西(数据结构比这复杂得多)。
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 ;
这也强调了我们遍历列表的事实。
答案 0 :(得分:14)
作业从右到左关联。换句话说:
a = b = c;
被解析为
a = (b = c);
这个顺序由标准保证。
也就是说,对于原始类型,它会将c
分配到b
和a
。对于非原始类型,它将调用a.operator= (b.operator= (c))
。