平成22年度 春期 午前 問22
コンピュータ構成要素
3アドレス命令に関する問題
次の一連の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)
- アb+c/d*e/f−g
- イb+c/d*(e/f−g)
- ウ(b+c/d)*e/f−g
- エ(b+c/d)*(e/f−g)
答えと解説を見る
✓ これが正解エ(b+c/d)*(e/f−g)
解説
一時変数の中身を上から順に書き下すと式が戻ります。
3アドレス命令は、二つの入力と結果の置き場所を並べて書く形なので、上から順に中身を追いかければ元の式が復元できます。一行目で c を d で割った値が w1 に入り、二行目で b にそれを足した値が w2 になります。三行目で e を f で割った値が w3 に入り、四行目でそこから g を引いた値が w4 になります。最後の行はこの w2 と w4 を掛けたものを x としています。つまり最後の掛け算が受け取るのは、足し算で完成した値と、引き算で完成した値の二つです。設問は掛け算が最も強く、次に割り算、その後に足し算と引き算という順を与えているので、この二つはどちらも括弧でくくらないと先に完成しません。判定の軸は、最後の乗算に入る時点で和と差が出来上がっている書き方になっているかどうかです。
ほかの選択肢はなぜ違うのか
- アb+c/d*e/f−g:括弧が一つもない書き方です。与えられた優先順位のもとでは乗算と除算が先に働いてしまい、bを足す処理と gを引く処理はどちらも最後に回るので、命令列の順序と合いません。
- イb+c/d*(e/f−g):後半だけを囲った書き方です。前半で bを加える処理が乗算より後になるため、乗算に入る左側の値が命令列の二行目で作った中身と食い違います。
- ウ(b+c/d)*e/f−g:前半だけを囲った書き方です。gを引く処理が乗算の外へ出てしまい、四行目で作ったはずの差ではなく、掛け算を済ませた後の値から gが引かれる形になります。
出典:平成22年度 春期 基本情報技術者試験 午前 問22
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)