次の一連の3アドレス命令で得られる結果xを表す式はどれか。
ここで,3アドレス命令では,三つのオペランドを用いた命令“c=a op b”を“op(a,b,c)”として表記する。
opは一つの演算子を表し,結果xを表す式においては優先順位の高い順に*,/,+,-とする。
/(c,d,w1)
+(b,w1,w2)
/(e,f,w3)
-(w3,g,w4)
*(w2,w4,x)
正答4
解説
正解は4です。
3アドレス命令の列を、1つの式にまとめる問題です。
命令を上から順に実行し、作業用変数w1〜w4に入る式を置き換えていきます。
【計算】
/(c,d,w1)より、w1=c/dです。
+(b,w1,w2)より、w2=b+c/dです。
/(e,f,w3)より、w3=e/fです。
-(w3,g,w4)より、w4=e/f-gです。
*(w2,w4,x)より、x=(b+c/d)*(e/f-g)です。
*は+や-より優先順位が高いので、和と差をそれぞれ括弧で囲む必要があります。
【選択肢別解説】
1:× 括弧がないため、優先順位の最も高い*でd*eが先に計算されます。
その結果、c/(d*e)/fにbを足してgを引く式になり、w2とw4を掛けるという命令列の意味と異なります。
2:× b+c/dに括弧がないため、*が先に計算され、d*(e/f-g)の値でcを割ってからbを足す式になります。
正しくはb+c/d全体に(e/f-g)を掛けます。
3:× e/f-gに括弧がないため、*が先に計算され、最後にgが引かれます。
正しくはe/f-g全体を掛けます。
4:○ w2=b+c/dとw4=e/f-gをそれぞれ括弧で囲み、掛け合わせた式です。
命令列の結果と一致します。
【ポイント】
命令列を式に直すときは、作業用変数を1つずつ代入していきます。
最後に、演算子の優先順位を考えて必要な括弧を付けるのがコツです。