11_変数のスコープ(局所変数と大域変数)

はじめに

この資料では、**変数のスコープ(有効範囲)**について学びます。特に「局所変数」と「大域変数」の違いを理解することで、プログラムの動作やバグの原因を正しく把握できるようになります。


スコープとは?

スコープとは、変数が使える範囲(有効範囲) のことを指します。 変数がどこで宣言されたかによって、使える範囲が決まります。


コード例:スコープの違い

// 大域変数の宣言
文字列型: a ← "A"

〇 add()
    // 局所変数の宣言
    文字列型: a ← "B"
    a を出力する

この場合、add() 内で出力されるのは "B" であり、大域変数 a ではありません。


注意点


理解度チェック問題

問題1:局所変数がグローバル変数と同じ名前の場合

文字列型: ch ← "X"

〇 programA()
    文字列型: ch
    ch ← "A"

〇 programB()
    ch ← "B"

〇 main()
    ch を出力する
    programA()
    ch を出力する
    programB()
    ch を出力する

main() を呼び出したときの出力として正しいものを選びなさい。

ア. A B X イ. B X A ウ. X A B エ. X B A

正解と解説 正解:**ウ** - 最初の出力は大域変数 `ch` の "X"。 - `programA()` では局所変数 `ch` を定義して "A" を代入するが、大域変数には影響しない。 - 2回目の出力も大域変数 "X"。 - `programB()` で大域変数 `ch` に "B" を代入。 - 最後の出力は "B"。

問題2:関数間で変数の影響がないことを確認
文字列型: a ← "A"

〇 programB(文字列型: b)
    b を出力する
    文字列型: a ← b
    a を出力する


programB("X") を呼び出したあと、a を出力する。
正解と解説 正解:**イ** 関数内の a は局所変数なので、外の a には影響しない。

問題3:関数内での大域変数の変更
文字列型: a ← "A"

〇 programC()
    a を出力する
    a ← "C"
    a を出力する

programC() を呼び出したあと、a を出力する。
正解と解説 正解:**イ** 関数内で局所変数として宣言されていないため、a は大域変数を直接操作している。

問題4(まとめ問題)

次の手続 main を呼び出したとき、「X」が何回出力されるかを求めなさい。

文字列型: msg ← "X"

〇 main()
    msg を出力する
    文字列型: msg ← "Y"
    msg を出力する
    show(msg)
    change()

〇 show(文字列型: value)
    value を出力する
    文字列型: msg ← value
    msg を出力する

〇 change()
    msg を出力する
    msg ← "Z"
    msg を出力する
正解と解説 正解:**イ** 出力が "X" となるのは `main()` 内の最初の出力のみ。以降は `"Y"` や `"Z"` が使われる。スコープによって `msg` は異なるものとして扱われることがある。