擬似言語の大域変数と局所変数|どこから見えて、いつ消えるか【基本情報技術者試験 科目B】

基本情報技術者試験

現行FE シラバス Ver9.2 準拠擬似言語の記述形式は2022年から変更なし最終更新 2026-08-22

プログラムを読んでいて、宣言が見当たらない変数が出てくることがあります。引数でも渡されていないのに、部品の中でいきなり使われている。その正体が大域変数です。G3-3 で名前だけ出しておいたものを、ここで正面から扱います。

大域変数 ── どの部品からも見える箱

宣言の頭に 大域: と付きます。置かれるのはプログラムのいちばん上、部品の宣言より前です。

出典:令和7年度 基本情報技術者試験 科目B 公開問題 問3(プログラムの一部)

大域: 整数型: stackPos ← 3
大域: 整数型の配列: stack ← {4, 3, 未定義の値, 未定義の値}

形はふつうの変数の宣言と同じで、頭に 大域: が足されているだけです。← 3 のように初めの値も一緒に書けます。

大域: も、記述形式の表に載っていない

IPAが定めた〔擬似言語の記述形式〕の表にあるのは 型名: 変数名 だけで、大域: という行はありません。return と同じ扱いです。

それでも読めるように作られています。問題文の側が、必ず日本語で説明してくれるからです。実際の出題では「大域の整数型の配列data」「大域変数orders」といった書き方で現れます。プログラムだけでなく、問題文も手がかりになります。

部品の中を読んでいて、宣言が見当たらない変数が出てきました。まず何をしますか。

局所変数 ── その部品の中だけの箱

いっぽう、部品の中で宣言された変数は、その部品の中だけのものです。これを局所変数といいます。

大域: 整数型: cnt ← 0

○fuyasu()
  整数型: x ← 10
  cnt ← cnt + x

cnt は大域、x は局所。引数も局所変数です。括弧の中で宣言されて、その部品が動いているあいだだけ存在します。

大域変数 cnt はどの部品からも見え、手続Aの x と手続Bの y はそれぞれの中だけで見える

大域はどの部品からも見える。局所は、その部品の中だけ

2つのことが、まとめて決まる

どこから見えるか大域=すべての部品/局所=その部品の中だけ

いつ消えるか大域=消えない/局所=部品が終わると消える

この2つはいつも一緒です。見える範囲が広いものは長く残り、狭いものはすぐ消えます。

呼ぶたびに、局所変数は作り直される

同じ部品を2回呼べば、局所変数は2回とも新しく作られます。前回の値は残りません(G3-2 で、同じ hyouji を違う値で2回呼んだときと同じです)。

いっぽう大域変数は、呼ばれても作り直されません。だから前に呼んだときの結果が残ります。

大域: と書かれた変数は、どの部品からも同じ1つの箱として読み書きできます。書かれていない変数は、その部品の中だけの箱です。

次のプログラムで main を呼び出しました。何が出力されますか。

大域: 整数型: cnt ← 0

○fuyasu()
  整数型: x ← 10
  cnt ← cnt + x

○main()
  fuyasu()
  fuyasu()
  cnt を出力する

トレースでの置き場所

この違いは、トレース表の書き方に直結します。

大域と局所を、書く位置で分ける

  1. 大域変数は、表のいちばん左に固定して置く。部品が変わっても列を消さない
  2. 局所変数は、その部品に入ったときに列を足す
  3. 部品を出たところで、局所の列は打ち切る(以降は書かない)
  4. 同じ部品をまた呼んだら、局所の列をもう一度まっさらで足す

どちらがいつまで残るのかを、書く位置で表してしまうわけです。頭で覚えておく必要がなくなります。

大域: と書かれた変数は、どの部品からも使えます。書かれていない変数は、その部品の中だけで使えます。

大域: 整数型: total ← 0

○tasu(整数型: n)
  整数型: bai ← n × 2
  total ← total + bai

○main()
  tasu(3)
  tasu(4)

main の中で、このあと bai を出力する と書いたらどうなりますか。

1行ずつ動かして確かめる

大域と局所を1本のプログラムに入れて、どちらが残り、どちらが消えるかを見ます。

大域: 整数型: nokori ← 10

○tsukau(整数型: kazu)
  整数型: mae ← nokori
  nokori ← nokori - kazu
  mae を出力する
  nokori を出力する

○main()
  tsukau(3)
  tsukau(4)

追いかける前に ─ このプログラムは何をする?

残り nokori から、渡された数だけ減らす手続を、2回呼ぶだけです。減らす前の値を mae に控えて、減らす前と減らしたあとを出力します。

渡した数 mae(減らす前) nokori(減らしたあと)
1回目 3 10 7
2回目 4 7 3

出力は 10、7、7、3。2回目の mae が 10 ではなく 7 になるところが、この回の要点です。

1回目に減らした結果が、2回目まで残っている ── nokori が大域だからです。局所の mae と kazu は、呼ぶたびに新しく作られます。

大域は残り、局所は消える

当サイトオリジナルの例題


ループ開始前

いま計算していること

まだ計算していません

変数の状態

トレース表(進めると1行ずつ積み上がります)

本物もこう書かれる

(令和7年度 基本情報技術者試験 科目B 公開問題 問3)スタックを扱う問題では、関数 push が変えた stackPos を、次に呼ばれた pop がそのまま受け取ります。

大域: 整数型: stackPos ← 3

これが局所変数だったら、push が終わった時点で消えてしまい、pop には何も伝わりません。部品をまたいで状態を持ち回りたいときに、大域変数が使われます。

つまずきポイントまとめ

まちがえ方 正しい理解
宣言の無い変数を見て、書き漏らしだと思う プログラムのいちばん上に 大域: の行がある
大域変数も呼ぶたびに初期値へ戻ると思う 作り直されるのは局所だけ。大域は前の結果が残る
引数を局所変数だと思っていない 引数も局所。部品が終われば消える
トレース表で局所の列を最後まで書き続ける 部品を出たところで打ち切る。大域は左端に固定
大域: を記述形式の表で探す 表には載っていない。return と同じで、問題文が説明する

次に読む

この記事で引用した資料

いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。

本文の例題と練習問題は当サイトのオリジナルです。

Copied title and URL