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

基本情報技術者試験

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

プログラムを読んでいて、宣言が見当たらない変数が出てくることがあります。引数でも渡されていないのに、手続や関数の中でいきなり使われている。その正体が大域変数です。

期間限定クーポンPR|Udemy の講座科目B オリジナル模試 3回分・60問42%OFF 1,500円2,600円中身を見る ›

大域変数 ── どの手続や関数からも見える箱

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

出典:令和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 は局所。引数も局所変数です。括弧の中で宣言されて、その手続や関数が動いているあいだだけ存在します。

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

大域はどの手続や関数からも見える。局所は、その手続や関数の中だけ

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

どこから見えるか大域=すべての手続や関数/局所=その手続や関数の中だけ

いつ消えるか大域=消えない/局所=手続や関数が終わると消える

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

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

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

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

次のプログラムで main を呼び出しました。出力される順はどれですか。

大域: 整数型: ban ← 1

○uketsuke()
  整数型: y ← ban
  ban ← ban × 2
  y を出力する

○main()
  uketsuke()
  uketsuke()
  uketsuke()

トレースでの置き場所

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

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

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

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

次のプログラムで 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)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では、引用した箇所の文言を改変していません(省略や補いがある場合は、その場に明記しています)。

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

タイトルとURLをコピーしました