副作用 | Programming Place Plus 用語集

トップページ用語集

名称

解説

評価することによって、変数が変わったり、外部のファイルの内容が変わったりといった、以降の処理の中でわかるような状態の変化が起こることです。

たとえば、a + 1 という式だけでは、変数 a の値が変化するわけではないので、副作用はありません。これが、b = a + 1 のような代入式になると、変数 b の値が変化しますから、副作用があります。

また、f() * 2 のような関数呼び出しを含む式では、関数内で静的変数を書き換えていたり、標準出力やファイルなどへ出力を行ったりしていれば、副作用があります。


式全体を、その式を評価したあとの値に置き換えても、まったく同じ結果になるのであれば、副作用はありません。そのような式の性質を、参照透過性といいます。

たとえば次のコードで、関数 f の呼び出しに副作用はありません。f(0) を評価すると 1 、f(0) * 2 を評価すると 2 です。ここで、f(0) * 2 という式を 2 に置き換えても、結果は一切変わりません。

int f(int a)
{
     return a + 1;
}

int x = f(0) * 2;

一方、次のコードの関数 f は、静的変数 s の値を変更しているので、副作用があります。f() を評価すると 1、f(0) * 2 を評価すると 2 です。ここで、f(0) * 22 に置き換えると、静的変数 s の値が変更されなくなるので、結果が変わってしまいます。実際、print(s) が出力する値は違ってしまうはずです。

static int s = 0;

int f()
{
     s += 1;
     return s;
}

int x = f() * 2;
print(s);


参考リンク

更新履歴


用語集のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る