Namespaces
Variants

As-if rule

From cppreference.net

プログラムの観測可能な動作を変更しないあらゆるコード変換を許可します。

説明

Cコンパイラは、以下の条件が満たされる限り、プログラムに対して任意の変更を加えることが許可されています:

1) すべての シーケンスポイント において、すべての volatile オブジェクトの値は安定している(以前の評価は完了しており、新しい評価は開始されていない)。
(C11まで)
1) volatile オブジェクトへのアクセス(読み取りおよび書き込み)は、それらが現れる式のセマンティクスに厳密に従って発生する。特に、同じスレッド上の他のvolatileアクセスに対して 並べ替えられない
(C11以降)
2) プログラム終了時、ファイルに書き込まれたデータは、プログラムが記述された通りに実行された場合と完全に一致します。
3) 対話型デバイスに送信されるプロンプトテキストは、プログラムが入力待ち状態になる前に表示されます。
4) プラグマ #pragma STDC FENV_ACCESS がサポートされており、かつ ON に設定されている場合、 浮動小数点環境 (浮動小数点例外と丸めモード)への変更は、浮動小数点算術演算子と関数呼び出しによって、以下の例外を除いて記述された通りに実行されるものとして観測されることが保証される:
  • キャストと代入以外の浮動小数点式の結果は、式の型とは異なる浮動小数点型の範囲と精度を持つ可能性がある( FLT_EVAL_METHOD を参照)、
  • 上記にかかわらず、任意の浮動小数点式の中間結果は、無限の範囲と精度で計算されるかのように計算される可能性がある( #pragma STDC FP_CONTRACT OFF でない限り)。
(C99以降)

注記

関連項目

C++ documentation for as-if rule