9

私たちのコードベースで、失敗したことがなくても、私には「正しく」見えないものを見つけました。

リンクされたリストに似たものにコードを切り詰めました (データ構造はそれよりもはるかに複雑です)。

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    ;

これは、リストをトラバースするという事実も強調しています。

4

1 に答える 1

14

割り当ては右から左に関連付けられます。言い換えると:

a = b = c;

として解析されます

a = (b = c);

この順序は標準によって保証されています。

つまり、プリミティブ型の場合、 と のc両方に割り当てられbますa。非プリミティブ型の場合、 を呼び出しますa.operator= (b.operator= (c))

于 2013-06-24T13:34:59.353 に答える