作成中のJavaの四則演算クラスに条件演算(三項演算子)および比較演算子を追加。
三項演算子は予想通りちょっと難しかった。三項演算子を2つ以上使った場合がどうなるか。
(1)… (a ? 1 : b) ? 2 : 3
(2)… a ? (b ? 1 : 2) : 3
(3)… a ? 1 : (b ? 2 : 3)
それぞれ、括弧を外した場合に認識できるかどうか。
(2)については、括弧を外しても2つ目の「:」が来た時点で内側の三項演算子が終わったと分かるから大丈夫。
でも(1)と(3)は、括弧を外すと全く同じ形になり、区別がつかない!
(aが真のときの結果が異なるはず)
Javaでは「?」の左側はbooleanでないとダメなので 上記のような例は直接は試せないんだけど、コンパイルが通るような値にして試してみたら、括弧なしの場合は(3)に解釈されるようだ。
という訳で、第一項は三項演算子より優先度が高い演算だけ解釈し、第二項・第三項は三項演算子以上の優先順位の解釈を行うようにしたら そのようになった。
(はっきり言って、偶然成功(爆))
二項演算子(通常の加減算など)では、同一優先順位の演算子が並んでいる場合に備えて解釈はループさせているんだけど、三項演算子では第三項が自分と同じ優先順位で解釈を行うので、ループさせる意味が無い。(この処理に戻ってきたときには再帰的に全ての三項演算子の解釈が終了しているはずだから)
ところで比較演算子のJUnitテストを書いてみてからようやく気付いたんだけど、変数が無いと比較演算って意味が無い(普通は使わない)のでは?!
※コメント投稿者のブログIDはブログ作成者のみに通知されます