14

C++03標準1.9/6は、観察可能な動作を定義しています。

抽象マシンの観察可能な動作は、揮発性データへの読み取りと書き込みのシーケンス、およびライブラリI/O関数の呼び出しです。

そして、1.9 / 7は副作用を定義します:

揮発性左辺値(3.10)で指定されたオブジェクトへのアクセス、オブジェクトの変更、ライブラリI / O関数の呼び出し、またはこれらの操作のいずれかを実行する関数の呼び出しはすべて副作用であり、実行環境の状態の変化です。

副作用は観察可能な行動ですか?それらはどのように相互に関連していますか?

4

1 に答える 1

16

いいえ、副作用は必ずしも観察可能な動作ではありません。たとえば、不揮発性オブジェクトの変更は副作用ですが、観察できません。観察可能な動作が同じままである限り、コンパイラによって副作用が再配置または完全に削除される可能性があるため、違いは重要です。

int main()
{
    int a;
    a = 30;
    a += 2;
    return 0;
}

ほとんどのコンパイラは、要求があれば完全に削除aします。それは許可されています。割り当てと追加は観察できません。

ただし、観察可能なすべての動作は、必然的に副作用でなければなりません。

于 2012-11-07T14:18:09.320 に答える