我在我们的代码库中发现了一些东西,即使它从未失败过,但对我来说并不“正确”。
我已将代码精简为类似于链表的内容(数据结构比这复杂得多)。
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 ;
这也强调了我们遍历列表这一事实。
最佳答案
赋值从右到左关联。换句话说:
a = b = c;
被解析为
a = (b = c);
并且此顺序由标准保证。
也就是说,对于基本类型,它将把c
赋给b
和a
。对于非原始类型,它将调用 a.operator= (b.operator= (c))
。
关于c++ - 双重赋值的评价顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17276766/