私たちのコードベースで、失敗したことがなくても、私には「正しく」見えないものを見つけました。
リンクされたリストに似たものにコードを切り詰めました (データ構造はそれよりもはるかに複雑です)。
Node * node = firstNode();
while( moreNodesAwaiting() )
{
Node * newnode = giveMeAnotherNode();
node = node->next = newnode ; // <-- This is what I don't like.
}
ここで未定義の動作が適用されるかどうかはわかりません。シーケンス ポイント間でデータ構造とそれへのポインターの両方を変更していますが、これは値を 2 回変更することと同じではありません。
また、コンパイラが任意の順序で式の要素を評価できる場合、代入が行われる前にnode->nextを評価できるということですか?
念のため、次のように変更しました。
node->next = newnode ;
node = node->next ;
これは、リストをトラバースするという事実も強調しています。