式を評価することによって、変数の値が変わったり、外部のファイルの内容が変わったりといった、以降の処理の中でわかるような状態の変化が起こることです。
たとえば、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) * 2
を 2
に置き換えると、静的変数 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で書く |
RSS | 管理者情報 | プライバシーポリシー |