条件式にANDやORを使う
論理積演算子(&&)や(&)を使えば条件式に対してAND条件を評価できます。
論理和演算子(||)や(|)を使えば条件式に対してOR条件を評価できます。
条件式の戻り値はboolean型ですが、条件式やboolean型を扱う演算は論理演算といわれています。
ちなみに数値を扱う演算は、四則演算(算術演算)、関係演算(==,!=,<=,>=......)、インクリメント、デクリメント、シフト演算、ビット単位演算など多数ありあります。
下のコードでは演算子(&&)と(&)を使って同じように論理積演算を行っています。
public class ExamAnd1 {
public static void main(String args[]) {
String ar[] = new String[3];
ar[0] = "a";
if(ar[1] != null && ar[1].equals("a")) {
System.out.println("OK!");
} else {
System.out.println("NO!");
}
}
}
class ExamAnd2 {
public static void main(String args[]) {
String ar[] = new String[3];
ar[0] = "a";
if(ar[1] != null & ar[1].equals("a")) {
System.out.println("OK!");
} else {
System.out.println("NO!");
}
}
}
<実行結果>
ExamAnd1はコンソールに”NO!”と表示されますが、
ExamAnd2を実行するとNullPointerExceptionが表示されます。
<(&&)と(&)の違い>
比較している内容は全く同じなのに、評価結果が異なるのは以下の理由からです。
if文の左の式 ar[1] != null では、ar[1]はnullですから、結果の戻り値は偽(false)です。
左の式を評価した時点で、論理積演算の結果は偽となる事が確定します。
演算子(&&)を使った場合、左の式を評価した時点で、条件が成立しない事が確定すれば、右の式は評価しません。
それに対して、演算子(&)の場合は必ず左右両方の式を評価します。
その為、右の式を実行し、NullPointerExceptionが発生します。
また、(||)と(|)の違いも同様です。
(&)と(|)は整数に対して使用です。
整数をオペランドにすると、オペランドのビット毎にAND、ORの演算を行います。