andとorの使い方
プログラムの構造でif文で複数条件を評価する時にand、orを使用しますが、これには別の意味もあります。
if( A and B ){ C }
AとBが両方ともtrueの時に、Cが実行される。ただし、必ずしもAとBが両方評価されるわけではありません。Aがfalseの場合、Bは評価する必要がないため無視されます。Aがtrueの場合のみBが評価されます。
下のようなプログラムの場合、気をつけないといけません。
if( db1.insert() and db2.insert() { success; }
db1へのインサートが成功した時のみdb2へのインサートが行われ、両方成功した時にsuccessになります。db1へのインサートが失敗した時は、if文としてfalseであることが確定しているため、db2へのインサートは無視されます。
orも同じように考えられます。
if( A or B ){ C }
AかBのどちらかがtrueであればCが実行されます。Aがtrueの場合、Bは評価する必要がないため無視されます。Aがfalseの場合のみBが評価されます。
応用で、
open(FILE,"file") or die "開けません";
PerlやPHPなんかでよく使う記述ですが意味は同じです。fileを開くのに成功した場合、orの後ろは評価する必要が無いので無視されます。fileを開くのに失敗した場合のみ、dieされるわけです。
$error_code = 1; 1 == $error_code and die "エラー";
こういう書き方はしないと思いますが、andの左側がtrueの場合のみdieされます。
if( str != null && str.equals("hello") ){
javaだとNullPointerException回避のために、こう書いたりしますよね。これはandの左側がtrueの場合のみ右側が評価されるので、strがnullであればその時点でfalseと判断され、右側のequalsが処理されません。
make && make install
シェルでもよく使います。&&はandと同じなので、makeが成功した場合のみmake installが実行されます。makeが失敗したなら、その時点でfalseになることが確定され、後ろのmake installは評価する必要が無いので実行されません。
if文で複数条件を比較する時、andやorの順番には意味があるので気をつけましょう。結果は同じでも、過程は違ってきます。
*PerlやJavaやPHPの実装ではこうなりますが、言語によっては違ってくるかも。