未定義の動作とシーケンス ポイントの再検討
トピック「未定義の動作とシーケンス ポイント」の続編では、次の動作を詳しく掘り下げます。ユーザー定義を含む式type.
ユーザー定義型と未定義の動作
ユーザー定義型のインデックスを含む次の式を考えてみましょう。
i += ++i;
動作組み込み型を使用したこの式は未定義です。ただし、i が Index 型の場合でも、未定義の動作が呼び出されますか?
いいえ、呼び出されません。これは、式が次と等価になるためです。
i.operator+=(i.operator++());
オーバーロードされた演算子は関数であるため、通常の順序付け規則が適用されます。シーケンス ポイントは i.operator () の評価後に存在するため、その後の i.operator =() 内の i の変更は未定義の動作ルールに違反しません。
同様に、式 i.add(i .inc());そして私は明確に定義されています。最初の式は次と同等です:
i.operator+=(i.operator++());
2 番目の式は次と同等です:
(i.operator++()).operator++()).operator++();
これらの式のそれぞれには、operator () 式の評価後にシーケンス ポイントがあります。オブジェクト i が連続するシーケンス ポイント間で 2 回変更されないようにします。
添字演算子オーバーロード
式:
a[++i] = i;
ここで、 a は添字演算子をオーバーロードするユーザー定義型でもあり、明確に定義されています。インクリメント演算子は Index オブジェクトを返し、このオブジェクトは配列のインデックス付けに使用されます。代入演算子 = は、関数呼び出しであるoperator[]() メソッドと同等です。したがって、順序付け規則が適用され、i の評価後に順序点が存在します。したがって、式は明確に定義されています。
追加ポイント
以上がC で演算子をオーバーロードすると、「i = i」のような式での未定義の動作が排除されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。