メインコンテンツへ
アルゴリズムとプログラミング変数のスコープ

次の疑似コードを実行したとき、最後に出力される値はどれか。 ``` var x = 10 function foo(): var x = 20 bar() print(x) function bar(): x = 30 foo() ``` ここで、`bar()` 内の `x = 30` はグローバル変数 `x` を変更し、`foo()` 内の `var x` はローカルスコープを生成するものとする。

ア.コンパイルエラーが発生する
イ.30
ウ.10
エ.20正解

解説

変数のスコープは「家の中の引き出し」のようなもの。foo の引き出し(ローカル x)は bar の引き出し(グローバル x)とは別の場所にある。bar がグローバル x をいくら書き換えても、foo の引き出しの中身は変わらない。

なぜ エ が正解か

foo() 内で `var x = 20` と宣言した時点で、foo のローカルスコープに x=20 が作られる。bar() を呼び出すと bar はグローバル x を 30 に変更するが、これは foo のローカル x とは別の変数である。bar() 終了後、foo() は自身のローカル x(=20)を print するため、出力は 20 となる。

なぜ ア は間違いか

スコープが異なる同名変数の共存は多くの言語で合法であり、コンパイルエラーにはならない。スコープとシャドーイングの概念を誤解した誤り。

なぜ イ は間違いか

`bar()` 内で x=30 と代入したのはグローバル変数の x であり、foo() のローカル変数 x には影響しない。グローバルスコープとローカルスコープを同一視した典型的な誤り。

なぜ ウ は間違いか

グローバル変数 x の初期値 10 を答えてしまっている。bar() による変更(x=30)でグローバル x は書き換わっているため、グローバル x は 10 ではなく 30 になっている。スコープの追跡が不完全な誤り。

出典: AI生成問題(学習用)