| 種類 | 宣言場所 | 有効範囲 | 別名 |
|---|---|---|---|
| 局所変数 | 関数の中 | その関数の中だけ | ローカル変数 |
| 大域変数 | 関数の外(プログラムの先頭) | プログラム全体 | グローバル変数 |
関数の中で大域変数と同じ名前の局所変数を宣言すると、その関数の中では局所変数が優先されます。 大域変数は隠れた状態になり、関数が終了すると局所変数は破棄されます。
文字列型: a ← "Global" // 大域変数
○ funcA()
文字列型: a ← "Local" // 局所変数(同名)
a を出力 // "Local" が出力される(局所優先)
// 大域変数 a は変わらない
○ main()
a を出力 // "Global"(大域変数)
funcA() // "Local" が出力される
a を出力 // "Global"(大域変数は変わっていない)
関数内で局所変数として宣言せずに代入すると、大域変数を直接変更できます。
文字列型: a ← "A" // 大域変数
○ funcC()
a を出力 // "A"(大域変数を参照)
a ← "C" // 大域変数 a を直接変更
a を出力 // "C"
○ main()
funcC()
a を出力 // "C"(大域変数が変更されている)
| パターン | コード例 | 結果 |
|---|---|---|
| 関数内で局所変数を宣言 | 整数型: x ← 99(関数内) |
大域変数 x は変わらない。関数内では局所変数が使われる |
| 関数内で大域変数を参照のみ | x を出力(宣言なし) |
大域変数の値が出力される。変更はしない |
| 関数内で大域変数を変更 | x ← 99(宣言なし) |
大域変数 x が直接書き換わる |
次のプログラムで main() を呼び出したとき、出力される順番として正しいものを選びなさい。
文字列型: ch ← "X" // 大域変数
○ programA()
文字列型: ch ← "A" // 局所変数
ch を出力
○ programB()
ch ← "B" // 大域変数を変更
ch を出力
○ main()
ch を出力
programA()
ch を出力
programB()
ch を出力
次のプログラムで programB("X") を呼び出した後に大域変数 a を出力するとどうなるか。
文字列型: a ← "A" // 大域変数
○ programB(文字列型: b)
b を出力
文字列型: a ← b // 局所変数として宣言
a を出力
文字列型: a ← b は局所変数として宣言しているため、大域変数の a には影響しません。
関数終了後に大域変数 a を出力すると "A" のままです。
次のプログラムで programC() を呼び出したときの出力の順番として正しいものを選びなさい。
文字列型: a ← "A" // 大域変数
○ programC()
a を出力 // 局所変数の宣言なし
a ← "C"
a を出力
次の手続 main を呼び出したとき、"X" が出力される回数として正しいものを選びなさい。
文字列型: msg ← "X" // 大域変数
○ main()
msg を出力
文字列型: msg ← "Y" // 局所変数として宣言
msg を出力
show(msg)
change()
○ show(文字列型: value)
value を出力
文字列型: msg ← value // 局所変数として宣言
msg を出力
○ change()
msg を出力 // 局所変数の宣言なし
msg ← "Z"
msg を出力