ゆき社長

シーゲンガーのお勉強 ゲームプログラマ、ゲーマー、色々!

論理演算子の交換法則と短絡評価

数学が得意という人が

プログラムの論理演算は数学と同じだから簡単といった

否!!

と速攻否定した

そう、けっこう多いんだよ この手の話で不具合が出るパターンってのは

数学では

AかつBなら BかつAは成立

AまたはBなら BまたはAは成立

もちろん 分配法則も結合法則も、ドモルガンの法則も成立する

プログラムでもたしかにどの法則も成立するので

数学とほぼ同じだが 下記のコード(C言語)

if( p && *p > 10 )

if( !p || *p < 20 )

交換法則をつかうと

if( *p > 10 && p )

if( *p < 20 || !p)

上記のコードは pがnullの場合は短絡評価され、後半の演算は行われない(事がある)

ので、null値が入ってきても問題ない

下記のコードは pがnullの場合は 前半の演算で null pointer exceptionを吐き 落ちる

プログラムの場合は 論理演算は短絡評価される事がある

ので、交換法則は成り立たない場合もある

って事で、お気をつけ下さい。

また 上記のコードの評価は、言語により動作も違う

また C++だと、演算子オーバーロードをしていると、上記でも ぬるぽ したりするので

本当は面倒でも if文を2段にして書くのが正しいです。