論理演算
高度な制御を目指して
ifステートメントなどによって、プログラムを分岐させて処理を分けることができました
しかし、さらに高度な処理として論理演算があります
この論理演算は、他言語経験者ならば何もいうことはないでしょう
論理演算は二つの評価をさらに評価します
関係演算子などのような値の評価ではなく、真か偽かをさらに評価します
利用方法としては、二つの条件式から得られた結果がTrueだった場合、という処理や
真であれば偽に、偽であれば真というような処理が可能になります
Java言語では真か偽かはboolean型で処理されています(trueとfalse)
boolean型の変数を宣言して、実際に論理演算してみましょう
実際にはifやwhileなどの制御文で使われるのが一般的ですが、この場は実験だと思ってください
class test {
public static void main(String args[]) {
boolean ans;
ans = true | false;
System.out.println("true or false\t= " + ans);
System.out.print(ans + " and false\t= ");
ans = ans & false;
System.out.println(ans);
System.out.print("not " + ans);
ans = !ans;
System.out.println("\t= " + ans);
}
}
もちろん実際にはこんなことをやっても大きな意味はありません
通常は真か偽を評価する制御文の評価時などに目的に応じて駆使します
では、論理演算子を使って否定積を作成してみましょう
否定積 NAND はANDの否定型です。つまり両辺のオペランドが真の場合のみ偽になります
class test {
public static void main(String args[]) {
int var = 10;
if ( ! ((var > 20) & (var < 50)))
System.out.println("if文を実行しました");
else System.out.println("falseと評価されました");
}
}
ショートカットを使う
論理積、論理和においてショートカット演算子というものが用意されています
もちろん得られる結果は 論理積、論理和と同じですが内部処理が異なります
ショートカット演算子は && や || と記述されます。見てのとおり前者が 論理積、後者が論理和です
&と | とは異なり、ショートカット演算子では必要最小限の式しか評価されません
つまり、&や | では両方のオペランドがいかなる結果でも評価されました
しかし、ショートカット演算子ではまず左辺だけを評価します
たとえば、 論理積ならば左辺のオペランドを調べてその結果が偽であれば、右辺のオペランドがなんであっても偽になり
論理和ならば、左辺のオペランドが真ならば右辺のオペランドがなんであれ真です
よって右辺のオペランドは無視されます
とうぜん、左辺だけで結果が出ない場合は右辺のオペランドも評価されます
このような処理をすることによって、いらない評価を避けて効率を上げることができます
しかし、関係演算子は論理演算子でどこまでも繋げることができます
このような場合は注意が必要であるということと、ショートカット演算子は優先順位が違うことにも目を向けてください
高い | !
|
---|
| > >= < <=
|
| == !=
|
| &
|
| ^
|
| |
|
| &&
|
低い | ||
|
---|
class test {
public static void main(String args[]) {
boolean ans;
ans = true && false || true;
System.out.print(ans);
}
}
関係演算子や論理演算子から得られる結果は常にboolean型です
論理演算子による複雑な演算になればなるほど、優先順位やその関係を注意してください