我在我们的代码库中发现了一些东西,即使它从未失败过,对我来说看起来也不“正确”。
我已经将代码精简为类似于链表的东西(数据结构比这复杂得多)。
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 ;
这也强调了我们遍历列表的事实。