【はじめてのjava】論理演算子【基本構文編】
はじめてのJava
このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。
基本構文編
基本構文編では、様々なプログラミング言語に存在する制御構文と呼ばれる文法について扱っていきます。
制御構文を利用すると「条件で分岐する処理」や「同じ処理の繰り返し」ができるようになります。
今回は論理演算子について解説していきます。
目次
論理演算
論理演算 とは複数の真偽値が組み合わさった式全体の真偽値を求める演算です。例えば数学では「x<10 かつ y<10 のとき」「x<10 または y<10 のとき」と書かれている場合、「x<10」と「y<10」という2つの条件式が組み合わさって1つの条件式を表しています。このように、別々の変数や条件式を組み合わせて全体として1つの真偽値を求める演算が論理演算です。
Javaの場合は複数のboolean型を組み合わせて真偽値を判定を記述する際に論理演算を使います。
論理演算については以下の4種類があります。
論理演算子
論理演算子 とは論理演算を行う演算子です。数学では「x<10 かつ y<10 のとき」「x<10 または y<10 のとき」と書きますが、Javaでこの「かつ」や「または」にあたるものが論理演算子です。
論理演算子はboolean型になるものであれば変数でも関係演算子による条件式でも組み合わせることが可能です。
論理演算子については以下の6種類があります。
論理積(AND)
論理積とはすべてtrueのときだけtrueをとなる論理演算です。
Javaでは&演算子や&&演算子で2つのboolean型の変数や条件式を組み合わせて記述します。
以下のように利用します。(解説に無関係な部分は省略しています。)
int x = 0; int y = 0; System.out.println(x < 10 & y < 10); //trueと表示される System.out.println(x < 10 && y < 10); //trueと表示される
&と&&では少し動作が異なります。詳しくはこちらにまとめてあります。Javaの試験では頻出ですので、試験を受ける場合は動作の違いを必ず理解しておいてください。
論理積の対応表
論理積の対応表は以下の通りです。
A | B | A & B A && B |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
論理積の覚え方
論理積の覚え方ですが、trueを1、falseを0と見立てた時に、1と0の掛け算の結果(積)がそのまま論理積になると覚えておくと良いでしょう。
0 ≦ x ≦ 10
数学では「xが0以上10以下」と書きたければ「0 ≦ x ≦ 10」と書くことができます。
しかし、Javaで「0 < x < 10」と記述するとコンパイルエラーになります。
一見すると「0 ≦ x ≦ 10」は1つの条件式に見えますが、これは「0 ≦ x」と「x ≦ 10」という2つの条件が組み合わさった条件式です。
Javaでは1つの条件式には1つの条件しか書けません。そのため2つ条件式が組み合わさった「0 ≦ x ≦ 10」という条件を書きたい場合は「0 < x」と「x < 10」という2つの条件式にして、この2つの式を論理演算子で1つにまとめる必要があります。
まとめると以下のようになります。
数学 | Java |
---|---|
0 ≦ x ≦ 10 | 0 <= x & x <= 10 0 <= x && x <= 10 x >= 0 & x <= 10 x >= 0 && x <= 10 |
論理和(OR)
論理和とはどれか一つがtrueであればtrueとなる論理演算です。
Javaでは|演算子や||演算子で2つのboolean型の変数や条件式を組み合わせて記述します。
以下のように利用します。(解説に無関係な部分は省略しています。)
int x = 0; int y = 100; System.out.println(x < 10 | y < 10); //trueと表示される System.out.println(x < 10 || y < 10); //trueと表示される
|と||では少し動作が異なります。詳しくはこちらにまとめてあります。Javaの試験では頻出ですので、試験を受ける場合は動作の違いを必ず理解しておいてください。
論理和の対応表
論理和の対応表は以下の通りです。
A | B | A | B A || B |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
論理和の覚え方
論理和の覚え方ですが、trueを1以上、falseを0と見立てた時に、1と0の足し算の結果(和)がそのまま論理和になると覚えておくと良いでしょう。
排他的論理和(XOR)
排他的論理和とは2つの値の論理和を取った際に、どちらか一つのみがtrueであればtrueとなる論理演算です。両方ともにtrueの場合はfalseになります。
ややこしく見えますが、「被ったらfalse」と覚えておくと覚えやすいでしょう。
Javaでは^演算子で2つのboolean型の変数や条件式を組み合わせて記述します。
以下のように利用します。(解説に無関係な部分は省略しています。)
System.out.println(true ^ true); //falseと表示される。ここだけ論理和と結果が異なる。 System.out.println(true ^ false); //trueと表示される System.out.println(false ^ true); //trueと表示される System.out.println(false ^ false); //falseと表示される
排他的論理和の対応表
排他的論理和の対応表は以下の通りです。
A | B | A ^ B |
---|---|---|
true | true | false |
true | false | true |
false | true | true |
false | false | false |
排他的論理和の覚え方
排他的論理和は通常の論理和に似ていますが、「排他的はひねくれものなので被ったらfalseになる」と覚えておくと良いでしょう。
否定(NOT)
否定とはtrueとfalseを逆転させた結果を返す論理演算です。
Javaでは!演算子をboolean型の変数や条件式に組み合わせて記述します。
以下のように利用します。(解説に無関係な部分は省略しています。)
boolean a = true; boolean b = false; System.out.println(a); //trueと表示される System.out.println(!a); //falseと表示される System.out.println(a); //!は変数の内容を変更するわけではないため、aの値自体はtrueのまま。 System.out.println(b); //falseと表示される System.out.println(!b); //trueと表示される
否定の対応表
否定の対応表は以下の通りです。
A | !A |
---|---|
true | false |
false | true |
否定の覚え方
否定は、内容をひっくり返してtrueとfalseを入れ替えると覚えておくと良いでしょう。
以下に論理演算子の記述例についてまとめた表を記述していきます。
演算子 | 記述例 | 説明 |
---|---|---|
& | a & b | aとbの両方がtrueのときtrue、それ以外の場合はfalse (aがfalseだった場合でもbの評価を行う。詳しくはこちらを参照。) |
&& | a && b | aとbの両方がtrueのときtrue、それ以外の場合はfalse (aがfalseだった場合はbの評価は行わない。詳しくはこちらを参照。) |
| | a | b | aかbのどちらか一方でもtrueであればtrue (aがtrueだった場合でもbの評価を行う。詳しくはこちらを参照。) |
|| | a||b | aかbのどちらか一方でもtrueであればtrue (aがtrueだった場合はbの評価は行わない。詳しくはこちらを参照。) |
^ | a ^ b | aとbの値が異なるときtrue、一致しているとfalse |
! | !a | aの値がtrueのときfalse、aの値がfalseの時true |
論理演算子を使用する際は、「&と&&の動作の違い」と「|と||の動作の違い」について注意が必要です。詳しくはこちらの記事で説明しています。
サンプルコード
実際に、if文と論理演算子を組み合わせたサンプルコードを見てみましょう。
package java_silver; public class Sample_ronri { static public void main(String[] args) { int x = 5; int y =15; if( x <= 10 && x >= 0 ) {//変数xの値は0以上かつ10以下という条件式 System.out.println(" x <= 10 && x >= 0 の結果はtrueです。"); } if( x <= 10 || x >= 0 ) {//変数xの値は0以上または10以下であるという条件式 System.out.println(" x <= 10 || x >= 0 の結果はtrueです。"); } if( y <= 10 && y >= 0 ) {//変数yの値は0以上かつ10以下という条件式 System.out.println(" y <= 10 && y >= 0 の結果はtrueです。"); } if( y <= 10 || y >= 0 ) {//変数yの値は0以上または10以下という条件式 System.out.println(" y <= 10 || y >= 0 の結果はtrueです。"); } } }
実行結果
上記のように、論理演算子を使用することで複数の条件に基づく分岐処理を実装することが出来るようになります。xとyに代入する値を調整することで、出力される文字列が変化します。どのような値を代入すれば、if文の中の条件式の結果が変わるのか確認してみてください。
はじめてのJavaシリーズの目次はこちら
プログラムの作り方編の記事一覧はこちら