平成30秋午後問8設問3e

すずきさん  
(No.1)
問8の計算処理の部分で質問です.
2×(-1)の場合,最初の繰り返しでipに1が入り,
0×-1の結果をValue[1]に格納
そのあとに最後の繰り返し処理を行うと,
ip+1, i<Opcnt, 1 が,2, i<2, 1
になり実行されないのではないかと思うのですが,
何か考え方が間違っているのでしょうか.
2021.06.10 03:03
こだまさん 
(No.2)
すずきさん

>> 2×(-1)の場合,最初の繰り返しでipに1が入り,
正しいです。

>> 0×-1の結果をValue[1]に格納
ここで間違えているのではないかと思います。

ipに1が入っているとき、chrには Operator[1]='-'が入ります。
したがって、0-1の結果がValue[1]に格納されます。

>> そのあとに最後の繰り返し処理を行うと,
>> ip+1, i<Opcnt, 1 が,2, i<2, 1
>> になり実行されないのではないかと思うのですが,
これで正しいです。
i:ip+1, i<Opcnt, 1 のループは一度も実行されません。

(実行されなくてよい理由)
2×(-1)では演算の優先度が昇順(左から右に大きくなっていく)に並んでいます。
この場合式のいちばん右から順に演算していけばよいので要素を左詰めする必要がなく、
ループが実行されなくても演算処理が正常に終了します。


以下、私がトレースした際のメモです。
何かの参考になれば幸いです。

---

○OpCnt=2のとき
  ip←0

  ●i:1, i<OpCnt(=2), 1 のループ
    ・i=1のとき
    Priority[0]<Priority[1] (2<11)なので
    ip←1
    ・i=2はi<OpCntを満たさないのでループ終了

  chr←Operator[1] = '-'
  chr = '-' なので
    Value[1] = Value[0]-Value[1] = 0-1 = -1
    ここでValue[] = [2,-1,...]となる
  
  ●i:ip+1(=2), i<OpCnt(=2), 1 のループ
    ・i=2はi<OpCntを満たさないのでループ終了
  
  OpCnt←OpCnt-1 = 1

○OpCnt=1のとき
  ip←0

  ●i:1, i<OpCnt(=1), 1 のループ
    ・i=1はi<OpCntを満たさないのでループ終了

  chr←Operator[0] = '×'
  chr = '×' なので
    Value[0] = Value[0]×Value[1] = 2 × -1 = -2
    ここでValue[] = [-2,...]となる

  ●i:ip+1(=1), i<OpCnt(=1), 1 のループ
    ・i=1はi<OpCntを満たさないのでループ終了

  OpCnt←OpCnt-1 = 0

OpCnt > 0 を満たさなくなったのでループ終了
Value[0] = -2 を計算結果としてreturn
2021.06.10 05:07
すずきさん  
(No.3)
ご丁寧な解説ありがとうございます,理解できました!
2021.06.10 16:45

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop