基本情報技術者 2010年 春期 午前(科目A) 問22
問題文
次の一連の3アドレス命令で得られる結果 x を表す式はどれか。ここで、3アドレス命令では、三つのオペランドを用いた命令 ““ を ““ として表記する。op は一つの演算子を表し、結果 x を表す式においては優先順位の高い順に とする。
選択肢
ア:
イ:
ウ:
エ:(正解)
🔒 解説は解答すると表示されます
三アドレス命令の式変換【午前解説】
正解の理由
命令をそのまま訳すと各行は次の代入になります。
- (つまり )
- (つまり )
これらをまとめると となるため、選択肢の中では エ が正解です。
解法ステップ
- 命令フォーマット を「」と読み替える。
- 各命令を逐次的に代入して一時変数 の値を求める。
- 最終命令 から を得る。
- の式を代入して にまとめる。
選択肢別の誤答解説
- ア:
- 解釈は で、掛け算・割算が連続的に適用された形です。三アドレス命令で生成される や の括弧構造が失われており不正解です。
- イ:
- 解釈は で、掛け算の左側が ではなく のみになっています。最終命令では左辺全体 (= )が掛けられるため不正解です。
- ウ:
- 解釈は で、右辺は ではなく のみが先に掛けられ、その後 が外に出ています。元の の形を保っていないため不正解です。
- エ:
- 各一時変数の意味をそのまま反映しており、正しく命令列を表現しています。したがって正解です。
(確認用の数値例) のとき、、、、、よって 。他の選択肢はこの結果と一致しません。
よくある誤解
- 「演算子優先順位だけで式を復元できる」と考える誤解:三アドレス命令は中間結果を明示するため、優先順位だけで括弧位置を決めてはいけません。
- 「掛け算は直前の項のみ掛ける」と誤認するミス:今回は掛けられるのは 全体と 全体です。局所的な項だけを掛けると間違いになります。
- 「op(a,b,c) を op(a,c,b) のように読み間違える」:フォーマットを正確に理解しないとオペランドの順序を逆にしてしまいます。
補足コラム
三アドレス命令(3-address code)はコンパイラの中間表現で、各命令が一時変数へ明示的に中間結果を格納します。これにより式の評価順や括弧構造が明確になり、最適化やコード生成が容易になります。与えられた問題は「中間表現から元の式を復元する」典型例で、抽象構文木(AST)で考えるとノード結合の順序がそのまま答えの括弧に対応します。
FAQ
Q1: なぜ演算子優先順位だけで解けないのですか?
A1: 優先順位はあくまで同じ式から暗黙に括弧を省略する際の規則です。ここでは中間変数が明示されており、どの部分が先に計算されているか(括弧で保護されているか)が命令列から明確に分かります。
A1: 優先順位はあくまで同じ式から暗黙に括弧を省略する際の規則です。ここでは中間変数が明示されており、どの部分が先に計算されているか(括弧で保護されているか)が命令列から明確に分かります。
Q2: op(a,b,c) の読み方を忘れたときは?
A2: 常に「最後のオペランドが結果を受け取る」形式()として読み替えてください。逆に読むとオペランドの順序を誤ります。
A2: 常に「最後のオペランドが結果を受け取る」形式()として読み替えてください。逆に読むとオペランドの順序を誤ります。
Q3: 同様の問題でミスを減らすコツは?
A3: 各命令を一行ずつ の形で書き出し、最後に置換して全体式を組み立てる習慣を付けることです。
A3: 各命令を一行ずつ の形で書き出し、最後に置換して全体式を組み立てる習慣を付けることです。
関連キーワード: 3アドレス命令、三アドレス命令、中間コード、抽象構文木、演算子優先順位、式展開、コンパイラ設計

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

