ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Java四則演算クラスに論理演算を追加するのを忘れてた

2006-06-01 22:12:48 | PG(Java)

Javaの四則演算クラスに、論理演算(ビット演算でないANDやOR)を加えるのを忘れてた(汗)

けっきょく、真偽値ではなく、値をそのまま返すことにした。(「2 || 3」は2)
なぜなら、0以外の値を1に変換する式は(三項演算子が使えるようになったので)書けるけど、逆は出来ないから。


Java四則演算クラスに比較演算子追加

2006-06-01 21:23:23 | PG(Java)

作成中の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テストを書いてみてからようやく気付いたんだけど、変数が無いと比較演算って意味が無い(普通は使わない)のでは?!


Java四則演算クラスにビット演算追加

2006-06-01 02:51:18 | PG(Java)

作成中のJavaの四則演算クラスに、ビット演算を追加。

ついでにメソッド名を変えてみたり、ルールクラスへ演算子登録をする場所を変えてみたり。これでちょっとはまとまって分かり易くなったかなぁ。

さらについでに、JavaDocで全クラス・全メソッド(publicだけだったが、privateまで)を生成することにした。
友人に見せたら改造したいようだったので、JavaDocをケチらない方がいいかなーと。
でもdoubleで演算したいようだったから、そこには対応してないので再修正する手間が増えちゃったかな(爆)

次は論理演算を追加しようかなー。と思うけど、Javaはboolean型なんだよね。真偽値をどういう値にするかはいくつか案があって、
(A) C言語のように1と0にする
(B) BASICのように-1と0にする
(C) 0以外と0にする

他の演算(特にビット演算)と混ぜた場合に結果が変わってくるんだよねー。
例えば「123 && 99」「123 || 99」は、
(A)  1 , 1
(B) -1 , -1
(C) 99 , 123
「||」では、前の値が真なら後は計算しないから。となると、(C)が面白そうかな。
いや しかし、Javaのライブラリだから(A)にすべきか(苦笑)

 

あと残るのは比較演算子と三項演算子。
べき乗も入れるか。Javaには無くてBASICだと「^」だけど、これは排他的論理和で使っちゃってるから、どこぞの言語に合わせて「**」かな(爆)

代入演算子を入れようと思ったら、変数が必要だなぁ…。面倒そう。
それに、「++」等のインクリメントは無視することにしたしなぁ。(右結合の演算子は優先順位をどう実装すればいいか分からないから(汗))

関数呼び出しも出来ればやりたい…。
あれ?そういえば、Javaには「,」(カンマ)演算子が無い?!