擬似言語の戻り値・手続と関数の違い|return と ○ の読み方【基本情報技術者試験 科目B】

基本情報技術者試験

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

前回は、呼び出すときに渡すものを見ました。今回は帰りに持ってくるものです。ここまで名前だけ出していた手続と関数も、この回で見分けられるようになります。

この回で分かること

呼ばれた部品が帰りに値を持ってくると、呼び出しを ← の右に書けるようになります。

持ってくるのが関数、持ってこないのが手続。見分けるのは、宣言の1か所だけです。

戻り値 ── 呼んだ側へ、値を1つ返す

2つ受け取って、足した結果を返す部品です。

○整数型: tasu(整数型: a, 整数型: b)
  return a + b

return は「この値を、呼び出した相手に返す」という意味です。tasu(2, 3) なら a が 2、b が 3 なので、2 + 3 = 5 が返ります。

返ってきた値は、そのまま箱に入れられます。

整数型: g ← tasu(2, 3)

矢印の右に呼び出しが書けるのは、そこから値が返ってくるからです。返ってきた 5 が、そのまま g に入ります。

自動販売機と、照明のスイッチ

前回、引数を「自動販売機に入れるお金」にたとえました。戻り値は、出てくるジュースです。入れたら、何かが出てくる ── これが関数。

いっぽう照明のスイッチは、押せば部屋は明るくなりますが、手元には何も出てきません。これが手続です。

手を出したときに、何か受け取れるかどうか。違いはそこだけです。

呼び出し側の tasu(2, 3) の 2 と 3 が a と b に入り、中で a + b を計算し、return で 5 が返って g に入る

渡して、中で使って、返す。この3つが1本につながっている

1本の流れとして読む

① 渡すtasu(2, 3) の 2 と 3 が、a と b に入る

② 中で使うa + b = 5 を計算する

③ 返すreturn で 5 が呼んだ場所へ戻り、g に入る

呼び出しの1行 整数型: g ← tasu(2, 3) の中で、この3つが全部起きています。

返す型は、宣言の先頭に書いてある

○整数型: tasu(…) の 整数型 が、返ってくるものの型です。括弧の中が入口、名前の前が出口と覚えると迷いません。

(令和8年度 基本情報技術者試験 科目B 公開問題 問2)実際の出題では ○8ビット型: complement(8ビット型: x) の中に return y があり、問題文が「x に加算すると00000000 になる値を返す」と説明しています。宣言の先頭の型と、問題文の説明 ── 手がかりはこの2つです。

return は記述形式の表に載っていない

IPAが定めた記号の一覧に return の行はありません。それでもプログラムには出てきます。上の2つの手がかりで読めるように作られているので、表に無いことは気にしなくて構いません。

返す値が無い部品には、return が出てきません。最後の行まで実行したら、呼んだ場所へ戻ります。

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

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

○整数型: tasu(整数型: a, 整数型: b)
  return a + b

○main()
  整数型: g ← tasu(4, 6)
  g ← tasu(g, 1)
  g を出力する

手続と関数 ── 違いは、値が返るかどうかだけ

tasu は値を返しました。返さないものもあります。並べてみます。

○整数型: tasu(整数型: a, 整数型: b)   ← 返す
○hyouji(整数型: n)                    ← 返さない

違いは○ と名前の間に型があるかどうかだけです。tasu には 整数型: があり、hyouji には何もありません。

手続 hyouji を呼ぶと出力だけして手ぶらで戻る。返るものが無いので呼び出しはそれだけで1行になる

手続 ── 呼んで、手ぶらで戻ってくる

関数 tasu を呼ぶと 5 を持って戻る。返るから ← の右に書いて箱に入れられる

関数 ── 呼んで、値を持って戻ってくる

宣言を見て、手続か関数かを決める手順

  1. 行の先頭の ○ を見つける
  2. ○ のすぐ次を読む
  3. そこがいきなり名前なら手続。呼び出しは1行で完結する
  4. そこに整数型: のような型があれば関数。呼び出しは ← の右に書ける
見分け方はここだけ

これは変数の宣言(整数型: x)と同じ「コロンの前が型」の形が、そのまま使われているだけです。新しい記号を覚える必要はありません。

手続は処理をひとまとめにしたもの、関数はそれに加えて値を1つ返すもの。返す値の型が、名前の前に書かれます。

実際の出題に出てくる宣言を、同じ見方で並べておきます。

実際に出てくる宣言 呼び出しの書き方 呼んだあと、どうなるか
○proc1() proc1() 中の処理が動く。返ってくるものは無い
○putRelatedItem(文字列型: item) putRelatedItem("A") item に "A" が入って動く。返ってくるものは無い
○整数型: maximum(整数型: x, 整数型: y, 整数型: z) m ← maximum(3, 9, 5) m に 9 が入る(3つのうち最大の値が返る)
○論理型: add(整数型: value) flag ← add(3) flag に true か false が入る

宣言の実例はいずれも令和5〜8年度 科目B 公開問題より

次のプログラムで main を呼び出すと 5 が出力されました。空欄に入るのはどれですか。

○整数型: tasu(整数型: a, 整数型: b)
  return a + b

○hyouji(整数型: n)
  n を出力する

○main()
  整数型: g ← 
  hyouji(g)
「1行で呼んでいるから手続」とは限らない

関数を呼んでおきながら、返ってきた値を使わないことがあります。実際の出題から引きます。

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

○論理型: add(整数型: value)
    …

○test()
  add(3)
  add(18)
  add(11)

add は宣言に 論理型: が付いているので関数です。それなのに test の中では、flag ← add(3) ではなく add(3) と1行で呼んでいます。

返ってきた true / false を使わずに捨てているだけで、関数であることは変わりません。種類を決めるのは呼び出し方ではなく、宣言のほうです。

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

tasu(返す)と hyouji(返さない)を、1本の中で続けて呼びます。いまどこにいるかと、g に何が入るかを並べて追ってください。

返す部品と、返さない部品を続けて呼ぶ

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


ループ開始前

いま計算していること

まだ計算していません

変数の状態

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

大域変数 ── 引数で渡されていないのに使える箱

部品が使う値は、ふつう引数で渡されてきます。ところが実際の出題には、渡されていないのに使われている変数が出てきます。

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

大域: 整数型: stackPos ← 3

宣言の頭に 大域: と付いた変数は、どの部品からも読み書きできます。だから引数で受け取っていなくても、部品の中に名前だけ出てきます。

「この変数、どこから来た?」と思ったら、上を見る

部品の中を読んでいて宣言が見当たらない変数が出てきたら、プログラムのいちばん上に 大域: の行がないかを探してください。たいていそこにあります。

読むために必要なのは、ここまでです。大域変数がいつまで残るのか、部品の中だけの変数と何が違うのかは、G10 大域変数と局所変数で扱います。

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

大域: 整数型: cnt ← 3

○fuyasu()
  cnt ← cnt + 1

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

トレース ── 呼び出しがあるときは、居場所と戻り先も書く

G2-3 では、変数を横に並べて値を書き足していきました。呼び出しが出てくると、それだけでは足りません。いま自分がどの部品を読んでいるのか、そして終わったらどの行に戻るのかが分からなくなるからです。

足す列は2つだけです。「いまどこ」と「戻り先」。次のプログラムで実際に書いてみます。

○calc()
  整数型: a ← add(2, 3)
  整数型: b ← a + 1

○整数型: add(整数型: x, 整数型: y)
  return x + y
実行した行 いまどこ 戻り先 a b x y
a ← add(2, 3) calc — — — — —
add に移る calc → add a ← add(2, 3) — — 2 3
return x + y calc → add a ← add(2, 3) — — 2 3
calc に戻る calc — 5 — 消える 消える
b ← a + 1 calc — 5 6 — —
引数は消える。大域は消えない

引数(x と y)は、その部品の中だけのものです。add が終わった瞬間に消え、calc からは見えません。だからトレース表でも、部品を出たところで打ち切って構いません。

いっぽう大域変数は、部品が変わっても消えません。だから表のいちばん左に固定して置くのが実戦的です。どちらがいつまで残るのかを、書く位置で分けてしまうわけです。

戻り先の列は、呼び出しが1段なら書かなくても間に合います。ただし部品の中からさらに別の部品を呼ぶ形になると、戻り先を控えていないと必ず迷子になります。この積み重なりを本格的に扱うのが再帰で、第2部で扱います。

つまずきポイントまとめ

まちがえ方 正しい理解
手続と関数の区別がつかない ○ と名前の間に型があれば関数、無ければ手続
呼び出し方で種類を決めてしまう 関数でも1行で呼んで値を捨てることがある。決めるのは宣言
手続の呼び出しを ← の右に書く 返るものが無いので入れられない。1行で完結する
return を記述形式の表で探す 表には載っていない。宣言の先頭の型と問題文の説明で読む
大域変数も戻ると消えると思う 消えるのは引数。大域変数は部品が変わっても残る

次に読む

この記事で引用した資料

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

Copied title and URL