次の2つは、条件がまったく同じです。それなのに、90点の人に出る結果が違います。
第1部 擬似言語の教科書 地図+20回
G1擬似言語の地図(入口)G2-1変数と宣言G2-2データ型G2-3代入「←」G3-1部品を呼ぶ/戻るG3-2引数G3-3戻り値・手続と関数G4-1配列と要素番号G4-2配列の読み書きG5選択処理 ifG6-1繰返し forG6-2配列を for で回すG7繰返し whileG8-1算術演算子と優先順位G8-2and / or / notG9-12次元配列G9-22重ループG10大域変数と局所変数G11未定義G12-1演算子 . の読み方G12-2クラスとはG12-3コンストラクタ
A
if (点数 > 80) "優" を出力する elseif (点数 > 60) "良" を出力する endif
B
if (点数 > 80) "優" を出力する endif if (点数 > 60) "良" を出力する endif
90点のとき、A は「優」だけ。B は「優」と「良」の両方が出ます。
この違いは、実際の試験でそのまま問われます。選択肢に if のものと elseif のものが並んでいて、どちらかを選ばせる出題です。
なぜ結果が変わるのかと、どちらを選べばいいのかを、順に見ていきます。
if そのものの読み方(もし〜なら)が不安なら、先に 選択処理 if / elseif / else を見てください。この記事は、そこから1点だけを取り出して詳しく扱います。
意味 ── endif は「この分かれ道はここまで」の印
先に、名前ではなく動きから押さえます。
if は分かれ道です。条件を見て、進む道を選びます。そして endif は、「この分かれ道はここで終わり」という印です。
終わったら、まっさらに戻る
endif を通り過ぎたら、分かれ道はもう無かったことになります。次の行からは、何も引きずらずに再開します。
「さっき優って出したな」とは覚えていません。プログラムは、そういう気の利き方をしません。
だから if … endif を2つ並べて書くと、分かれ道が2つできます。2つ目は1つ目の結果を知らないので、自分の条件だけを見て、独立に判断します。
いっぽう elseif は、分かれ道を終わらせずに、道を増やす書き方です。endif がまだ来ていないので、ぜんぶで1つの分かれ道のままです。
同じ条件でも、つないだか切ったかで通る道の数が変わる
ここから先、A を「ひとつの分かれ道」、B を「別々の分かれ道」と呼びます。elseif や endif という名前より、この2つの違いのほうが大事です。
具体例 ── 90点のとき、1行ずつ何が起きるか
言葉だけだと分かりにくいので、実際に1行ずつ追います。
B(別々の分かれ道)の場合
| 調べる行 | 何を調べるか | 結果 |
|---|---|---|
if (点数 > 80) |
90 > 80 を調べる | 真。中へ入る |
endif |
1つ目の分かれ道が終わる | ここでリセット |
if (点数 > 60) |
90 > 60 を調べる | 真。中へ入る |
「優」を出したことは、2つ目の if に伝わっていません。だから 90 > 60 も素直に調べて、真なので「良」も出ます。
A(ひとつの分かれ道)の場合
| 行 | 何をするか | 結果 |
|---|---|---|
if (点数 > 80) |
90 > 80 を調べる | 真。中へ入る |
"優" を出力する |
出力する | 「優」 |
elseif (点数 > 60) |
─ | 調べない |
endif |
分かれ道が終わる | ─ |
elseif (点数 > 60) は、偽だったのではありません。調べてすらいません。
90 > 60 は真です。それでも見に行かない。すでに上の道に入ったので、この分かれ道での用事は済んでいるからです。
実際に動かして確かめます。前半(A)と後半(B)を、同じ 点数 = 90 で続けて実行します。出力を見比べてください。
ひとつの分かれ道と、別々の分かれ道 ── 同じ 点数 = 90 で比べる
当サイトオリジナル
ループ開始前
いま計算していること
変数の状態
出力
トレース表(進めると1行ずつ積み上がります)
なぜ大事か ── 出題では、ここが空欄になる
この違いは、知識として問われるのではありません。プログラムの一部が空欄になり、選択肢に if のものと elseif のものが並ぶ形で出ます。
出典:令和6年度 基本情報技術者試験 科目B 公開問題 問1(プログラムの一部)
if ( )
return x
elseif (y > z)
return y
この形が読めると、空欄を考える前に分かることがあります。
空欄の下に elseif がある、ということは
ひとつの分かれ道です。だから 上の道に入ったら、下の elseif は調べられません。
つまり、elseif (y > z) の行に進めたということ自体が、「空欄の条件は偽だった」という情報になります。空欄に何を入れるかを考えるとき、この情報がそのまま手がかりになります。
どちらを選ぶか ── 日本語で決まる
迷ったら、やりたいことを日本語で言ってみてください。言い方で決まります。
| やりたいことの言い方 | 使うもの | 例 |
|---|---|---|
| 「どれか1つだけ」 どれに当てはまるか |
ひとつの分かれ道 ( elseif でつなぐ) |
ランク分け・等級・区分・判定 |
| 「当てはまるもの全部」 それぞれ別に確かめたい |
別々の分かれ道 ( if を並べる) |
チェック項目・条件ごとの加算 |
ランク分け・区分け・分類は、ほぼ必ず「ひとつの分かれ道」です。並んだ if で書かれていたら、それは重複して当てはまることを許しているというサイン ── つまり、書いた人がわざとそうしています。
練習
在庫が120 のとき、次のプログラムは何を出力しますか。
if (在庫 > 100) "多い" を出力する elseif (在庫 > 50) "普通" を出力する endif
金額が6000 のとき、次のプログラムは何を出力しますか。
if (金額 > 5000) "送料無料" を出力する endif if (金額 > 3000) "送料半額" を出力する endif
次の2つのうち、if を2つ並べて書くべきなのはどちらですか。
① 点数が80以上なら "優"、そうでなく60以上なら "良" ② 身長が150以上ならチェック、体重が40以上ならチェック
書き方の一覧
| ひとつの分かれ道 | 別々の分かれ道 | |
|---|---|---|
| 書き方 | elseif でつなぐ |
if … endif を並べる |
endif の数 |
1つ | 並べた数だけ |
| 通れる道 | 1本だけ | 当てはまるだけ何本でも |
| 上に入ったとき、下の条件は | 調べられない | 調べられる |
| 向いている場面 | ランク分け・区分け・判定 | チェック項目・条件ごとの加算 |
次に読む
> と ≧ の境界入口擬似言語の読み方 ─ 記号と書き方の一覧目次基本情報技術者試験 科目B 攻略ガイドこの記事で引用した資料
- 擬似言語の記述形式 科目Bの公開問題・サンプル問題の各冊子に掲載。冊子上の名称は年度により「基本情報技術者試験用」と「基本情報技術者試験,応用情報技術者試験用」があるが、本文は同一
- 令和6年度 基本情報技術者試験 科目B 公開問題(2024年7月5日公開)
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
点数からランクを決める例と、シミュレータのプログラムは当サイトのオリジナルです。

