プログラムを読んでいて、宣言が見当たらない変数が出てくることがあります。引数でも渡されていないのに、手続や関数の中でいきなり使われている。その正体が大域変数です。
期間限定クーポンPR|Udemy の講座科目B オリジナル模試 3回分・60問42%OFF 1,500円この回の内容を動画で見る
次のページで講義の目次と無料の講義を見られます。受講ボタンとクーポンコードもそこにあります。
この回の内容を動画で見る
解くための再現性が身につく講義29本小テスト86問模試3回分IT資格の森で見る
講義「大域変数・局所変数と未定義」(全6分52秒)は、IT資格の森(月額1,280円)の会員向けです。科目Bは、1行ずつ値を追うアニメの講義と、講義ごとの小テスト、本番と同じ形の模擬試験がそろっています。
大域変数 ── どの手続や関数からも見える箱
宣言の頭に 大域: と付きます。置かれるのはプログラムのいちばん上、手続や関数の宣言より前です。
出典:令和7年度 基本情報技術者試験 科目B 公開問題 問3(プログラムの一部)
大域: 整数型: stackPos ← 3
大域: 整数型の配列: stack ← {4, 3, 未定義の値, 未定義の値}
形はふつうの変数の宣言と同じで、頭に 大域: が足されているだけです。← 3 のように初めの値も一緒に書けます。
大域: も、記述形式の表に載っていない
IPAが定めた〔擬似言語の記述形式〕の表にあるのは 型名: 変数名 だけで、大域: という行はありません。return と同じ扱いです。
それでも読めるように作られています。問題文の側が、たいてい日本語で説明してくれるからです。実際の出題では「大域の整数型の配列data」「大域変数orders」といった書き方で現れます。プログラムだけでなく、問題文も手がかりになります。
次のプログラムの saidai の中で使われている名前のうち、括弧の中にも、saidai の中にも宣言が無い変数はどれですか。配列の要素番号は1から始まります。
大域: 整数型の配列: data ← {5, 3, 8}
○整数型: saidai(整数型: k)
整数型: m ← data[1]
m ← m + k
return m
局所変数 ── その手続や関数の中だけの箱
いっぽう、手続や関数の中で宣言された変数は、その手続や関数の中だけのものです。これを局所変数といいます。
大域: 整数型: cnt ← 0 ○fuyasu() 整数型: x ← 10 cnt ← cnt + x
cnt は大域、x は局所。引数も局所変数です。括弧の中で宣言されて、その手続や関数が動いているあいだだけ存在します。
大域はどの手続や関数からも見える。局所は、その手続や関数の中だけ
2つのことが、まとめて決まる
どこから見えるか大域=すべての手続や関数/局所=その手続や関数の中だけ
いつ消えるか大域=消えない/局所=手続や関数が終わると消える
この2つはいつも一緒です。見える範囲が広いものは長く残り、狭いものはすぐ消えます。
同じ手続や関数を2回呼べば、局所変数は2回とも新しく作られます。前回の値は残りません(G3-2 で、同じ hyouji を違う値で2回呼んだときと同じです)。
いっぽう大域変数は、呼ばれても作り直されません。だから前に呼んだときの結果が残ります。
次のプログラムで main を呼び出しました。出力される順はどれですか。
大域: 整数型: ban ← 1 ○uketsuke() 整数型: y ← ban ban ← ban × 2 y を出力する ○main() uketsuke() uketsuke() uketsuke()
トレースでの置き場所
この違いは、トレース表の書き方に直結します。
大域と局所を、書く位置で分ける
- 大域変数は、表のいちばん左に固定して置く。呼ばれている手続や関数が変わっても列を消さない
- 局所変数は、その手続や関数に入ったときに列を足す
- 手続や関数を出たところで、局所の列は打ち切る(以降は書かない)
- 同じ手続や関数をまた呼んだら、局所の列をもう一度まっさらで足す
どちらがいつまで残るのかを、書く位置で表してしまうわけです。頭で覚えておく必要がなくなります。
次のプログラムで main を呼び出しました。kiroku(5) から main に戻った時点で、まだ残っている変数はどれですか。
大域: 整数型: kaisu ← 0 ○kiroku(整数型: v) 整数型: w ← v × 2 kaisu ← kaisu + 1 ○main() kiroku(5)
1行ずつ動かして確かめる
大域と局所を1本のプログラムに入れて、どちらが残り、どちらが消えるかを見ます。
大域: 整数型: nokori ← 10 ○tsukau(整数型: kazu) 整数型: mae ← nokori nokori ← nokori - kazu mae を出力する nokori を出力する ○main() tsukau(3) tsukau(4)
残り nokori から、渡された数だけ減らす手続を、2回呼ぶだけです。減らす前の値を mae に控えて、減らす前と減らしたあとを出力します。
大域は残り、局所は消える
当サイトオリジナルの例題
ループ開始前
いま計算していること
変数の状態
出力
トレース表(進めると1行ずつ積み上がります)
動かした結果
出力は 10、7、7、3。2回目の mae が 10 ではなく 7 になるのは、1回目に減らした結果を、大域の nokori が持っているからです。
(令和7年度 基本情報技術者試験 科目B 公開問題 問3)スタックを扱う問題では、関数 push が変えた stackPos を、次に呼ばれた pop がそのまま受け取ります。
大域: 整数型: stackPos ← 3
これが局所変数だったら、push が終わった時点で消えてしまい、pop には何も伝わりません。複数の手続や関数をまたいで状態を持ち回りたいときに、大域変数が使われます。
つまずきポイントまとめ
| まちがえ方 | 正しい理解 |
|---|---|
| 宣言の無い変数を見て、書き漏らしだと思う | プログラムのいちばん上に 大域: の行がある |
| 大域変数も呼ぶたびに初期値へ戻ると思う | 作り直されるのは局所だけ。大域は前の結果が残る |
| 引数を局所変数だと思っていない | 引数も局所。手続や関数が終われば消える |
| トレース表で局所の列を最後まで書き続ける | 手続や関数を出たところで打ち切る。大域は左端に固定 |
大域: を記述形式の表で探す |
表には載っていない。return と同じで、問題文が説明する |
次に読む
この記事で引用した資料
- 擬似言語の記述形式 IPAが公開している科目Bの公開問題・サンプル問題(PDF)の冒頭に掲載。名称は年度により「基本情報技術者試験用」と「基本情報技術者試験,応用情報技術者試験用」があるが、本文は同一
- 基本情報技術者試験 シラバス Ver9.2(2026年1月8日)
- 令和5年度 基本情報技術者試験 科目B 公開問題(2023年7月6日公開)
- 令和6年度 基本情報技術者試験 科目B 公開問題(2024年7月5日公開)
- 令和7年度 基本情報技術者試験 科目B 公開問題(2025年7月4日公開)
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では、引用した箇所の文言を改変していません(省略や補いがある場合は、その場に明記しています)。
本文の例題と練習問題は当サイトのオリジナルです。


