2

次の式のシーケンス ポイントを考慮します。

i = (++i,i++,i);

私が正しければ、実行の手順は次のようになります。

1)

++i, i++

2)

step1,i

3)

i = step2

ステップ 1 の評価では、コンストラクトを定義済みと呼ぶには、i の値を 1 回だけ変更する必要があります (コンマ演算子の評価後にシーケンス ポイントがあるため)。しかし、ここではそうではないと思います。したがって、未定義にする必要があります。この回答をご覧ください。ここでは、上記の式を定義済みと呼びます。何か不足していますか?

4

1 に答える 1

4

次の命令の動作は明確に定義されています。

i = (++i, i++, i);

実際、コンマ演算子 ( ,) の最初のオペランドと 2 番目のオペランドの評価の間にはシーケンス ポイントがあります。標準の附属書 C は、参考情報ではありますが、シーケンス ポイントの説明を提供します。

C11、附属書 C シーケンス ポイント

以下は、5.1.2.3 で説明されているシーケンス ポイントです。

— 関数呼び出しでの関数指定子と実引数の評価と実際の呼び出しの間。(6.5.2.2)。

— 次の演算子の第 1 オペランドと第 2 オペランドの評価の間: 論理 AND && (6.5.13); 論理和 || (6.5.14); コンマ、(6.5.17)。

— 条件式の最初のオペランドの評価の間 ? : 演算子と、2 番目と 3 番目のオペランドのいずれかが評価されます (6.5.15)。— 完全な宣言子の終わり: 宣言子 (6.7.6);

— 完全な式の評価と、次に評価される完全な式の間。以下は完全な式です: 複合リテラル (6.7.9) の一部ではない初期化子。式文中の式(6.8.3); 選択ステートメントの制御式 (if または switch) (6.8.4); while または do ステートメントの制御式 (6.8.5)。for ステートメントの各 (オプションの) 式 (6.8.5.3); return ステートメントの (オプションの) 式 (6.8.6.4)。

— ライブラリ関数が戻る直前 (7.1.4)。— 各書式付き入出力関数変換指定子 (7.21.6、7.29.2) に関連付けられたアクションの後。

— 比較関数の各呼び出しの直前と直後、および比較関数の呼び出しとその呼び出しに引数として渡されたオブジェクトの移動の間 (7.22.5)。

于 2012-09-01T08:23:27.537 に答える