論理演算子の交換法則と短絡評価
数学が得意という人が
プログラムの論理演算は数学と同じだから簡単といった
否!!
と速攻否定した
そう、けっこう多いんだよ この手の話で不具合が出るパターンってのは
数学では
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段にして書くのが正しいです。