2012-11-07 7 views
13

C++ 03標準の1.9/6は観察可能な行動を定義していますC++で副作用と観察可能な動作はどのように関連していますか?

抽象機械の観察可能な行動を読み込み、揮発性データへの書き込みとライブラリI/O関数の呼び出しのその配列です。

した後、次いで、1.9/7 副作用定義:

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

副作用は観察可能な振る舞いですか?彼らはどのようにお互いに関係していますか?

答えて

14

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

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

ほとんどのコンパイラは、要求された場合、完全にaを削除します。それは許されている。割り当てや追加は観測できません。

すべての観察可能な振る舞いは必ずしも副作用でなければなりません。

関連する問題