記事内では「です」「ます」調を使っていないのですが、最初は理解できたことなどをそのまま思うままに書いていくつもりなので許してください。
では続きをどうぞ。
はじめに
今回は演算子の一つ、論理演算子について。
演算子の種類は主に以下のものが挙げられる。
- 算術演算子…四則演算や余りの計算で使うもの(「+」や「-」など)
- 比較演算子…ある数より大きいか小さいかを表すもの(「==」や「>」、「<」など)
- 代入演算子…ある文字や数を代入するときに使うもの(「=」や「+-」、「-=」など)
- 論理演算子…「~ではない」、「~と~」などをあらわすもの(「!」や「&&」など)
- インクリメント演算子…ある数に1を加えるということを表すもの(「++」)
- デクリメント演算子…ある数から1を減らすということを表すもの(「–」)
前回は代入演算子について書いた。
今回は「論理演算子」とは何ぞやについてみていく。
論理演算子の種類
論理演算子も比較演算子と同じように、「if」を使った構文などの条件分岐で使用されることが多いみたい。
条件分岐については今度またしっかりと学習。
比較演算子も所でも簡単に触れたが、条件分岐の構文の一つ「if」の使い方は以下のような感じ。
簡単に言えば、「if(){}」という形をとる。
()の中の条件が合えば、{}内のプログラムを処理するというもの。
高校の数学でこんな図を見た記憶はないだろうか?
これは「A且つB(AでありBでもある部分)」、「AまたはB」などを表すことができる円。
論理演算子はこの円に当てはめることができる。
! NOTを表す演算子
これは上の図でいうと、オレンジの部分に当たる部分。
それ以外という意味で、どれにも当てはまらないことを指す。
例えば、以下のような例。
if(!(A<2)) {
System.out.println(“正常に作動”);
}
(例えが悪いかもしれない…。)
「!」の使い方としては、「!〇」⇒〇の結果が合っているか、間違っているかという判断。
〇の中に式(A<2など)をいれて、その式があっていれば、「!」は間違った結果ということになる。
逆に〇の中の式が間違っていれば、「!」は正しい結果ということになる。
天邪鬼
式を一つ一つ見ていこう。
if(!(A<2)) {
System.out.println(“正常に作動”);
}
「int A=3;」は変数Aに「整数3」を入れますよという宣言。
if(!(A<2)) {}はif構文。
ここを理解しよう。
ifは次の()の中に条件を書く。その条件が「!(A<2)」。
この式の見方は、まず()の式に注目。
数学と同様に、()で括ったものを先に計算する。
※この式を()で括っているのは、演算子「!」の優先度が高いから、括らないとまず「A<2」の式を見てくれず、「!A」の式が優先されて「<2」がその後に計算されるという意味不明な式になるため。
()の中は「A<2」で「Aが2より小さい」を表す。
そしてその式が「!」だったら正しい結果ということ。
だって「!」はNOT(違う、異なる)を表すから。
「A=3」と宣言。
↓
条件は「!(A<2)」。
↓
「Aは2より小さい(A<2)」という式は「違う、間違っている(!)」
⇒Aは3だからif構文のカッコ内の条件は合っている。
↓
if構文の{}内の処理を実行
↓
「正常に作動」と表示される
天邪鬼な「!」さん。
「!〇」の〇が合っていれば間違いで、〇が間違っていれば合ってる
以上が一連の流れ。
あんまり「!」のいい例えじゃなかったかも…。
別の例え
System.out.println(!(A<13));
実はこの論理演算子はSystem.out.println()の中にそのまま条件を書くことで、プログラムを実行すると、その条件に合っていれば「true」、間違っていれば「false」と表示してくれるのだ。
今までいろいろ調べて”「true」を返す、「false」を返す”って説明ばかりで「返す」ってなんじゃって思ってた。
論理演算子を含んだプログラムを実行することで「true」もしくは「false」が表示されるということだったのね。
System.out.println()中のAに「11」を代入すると、「11<13」となる。
このままだったら合ってる。
だけど(A(11)<13)の外にはNOTを表す「!」がある。
これは、「!(A<13)」は「A<13の式が間違っている」という宣言。
Aは11なので「11<13」自体は式として間違っていないから、「!(A<13)」の宣言は間違っている。
⇒よって、画面には「false」と表示される。
もしAが「15」で、「!(A<13)」となっていたら、「(A<13)」は「(15<13)」ということ。
その外側に「!」がある。
「!(A<13)」は「15<13(A<13)」じゃないよ(!)ということで、合っている。
⇒ よって、画面には「true」と表示される。
&& ANDを表す演算子
もう一度この図を見てみる。
この「&&」は上の図でいうと赤い部分を表すもの。
AとBというものがあれば、Aに当てはまり、かつBにも当てはまるということ。
それが上の図の赤い部分。
int A=12;
if((A<15)&&(A%3==0)) {
System.out.println(“正常に作動”);
}
上から見ていこう。
「int A=12」はお馴染み、「変数Aに12を入れますよー」という宣言をしている。
次がif構文。
()内の条件が当てはまれば、{}内の処理が行われるというもの。
()内は「(A<15)&&(A%3==0)」と書かれている。
一見複雑そうだけど実はこれまでやってきたことの組み合わせ。
ごちゃごちゃ書いているように見えるこの式だが、シンプルに書くと「△&&□」という形になっている。
「(A<15)」が△、「(A%3==0)」が□。
それを「&&」でつないでいるだけ。
int A=12と定義しているからAは「12」。
(A<15)のAに「12」を当てはめると「(12<15)」。⇒式は合っている。
お次は「(A%3==0)」に注目。
このAに「12」を代入すると、「(12%3==0)」となる。
これは演算子の優先度にも関係しているが、「%」の方が「==」よりも優先度が高い。
そのため、「12%3」を先に計算する。
※もしも、「3==0」の方を先に参照したかったら()かっこで括ればよい。
演算子の優先度については今度まとめたい。
ここではとりあえず、「%」の方が「==」よりも優先されると知っておけばよいかと。
「12%3」は、余りの計算。
余りについては以下にまとめている。
Javaプログラミング初心者の記録vol.9 その他の数字の演算-余り編
「12割る3」を計算すると「4」となり、きれいに「3」で割り切れる(3の倍数である)から余りは「0」。
よって、「12%3」の計算結果(余り)は「0」だから、(12%3==0)に結果を代入すると(0==0)となる。
「==」は比較演算子で「等しい」ということを意味する。
比較演算子については以下参照。
Javaプログラミング初心者の記録 演算子-比較演算子 Vol.11
「0」と「0」はもちろん等しいから「(A%3==0)」という式も合っている。
改めてif構文の()内を見てみると、「(A<15)&&(A%3==0)」。
Aが「12」という数字は(A<15)に当てはまり、かつ(&&)(A%3==0)にも当てはまる。
⇒if構文の()内の条件に当てはまるから{}内のプログラムが実行される。
⇒「正常に作動」と表示される
trueもしくはfalseで表示
System.out.println()の中に、上で書いたif構文の()内の式を入力して実行すると、条件が合えば「true」、違っていれば「false」と表示される。
新しいクラスを作って、下の式をそのまま入力してみたらわかるよ。
System.out.println((A<15)&&(A%3==0));
この式は『「A<15」の条件を満たし、かつ「A%3==0」の条件を満たすか』ということを表す。
この式ではこの条件をどちらも満たしている。
よって、プログラムを実行すると、画面には「true」と表示される。
「&&」はどちらの条件も満たす必要がある。
もし1つでも条件が満たされていなかったら、「false」と表示される。
|| ORを表す演算子
赤い部分は「&&」で、左右の円の「どちらにも当てはまる部分」を表すということは分かった。
ここで扱う「||」はどこの部分を指すのか。
それは、緑の部分と赤の部分。
よって、「||」は「どちらかに当てはまる部分」ということを表す英語の「OR」という意味。
前で扱った「△&&□」はどちらにも当てはまらないとダメだった。
でも「△||□」(OR:AかB)だったら、どちらかに当てはまれば良いということ。
if((A<15)||(A%3==0)) {
System.out.println(“正常に作動”);
}
int A=11はお馴染み、変数Aに11を代入しますよという宣言。
続いてif構文の()内に注目。
「A<15」と「A%3==0」を「||」で繋いでいる形。
まず、「A<15」のAに「11」を代入すると、「11<15」となり当てはまる。
「A%3==0」のAに「11」を代入すると、「11%3==0」となる。
「11%3(11割る3)」を計算すると、余りが「2(3と余り2)」となる。
「A%3==0」に結果を代入すると、「2==0」となる。
「2」と「0」はもちろん等しくない。
よって、この式は当てはまらない。
もう一度式を見てみる。
if((A<15)||(A%3==0)) {
System.out.println(“正常に作動”);
}
if構文の中の式は、(A<15)の部分は当てはまるが、(A%3==0)の部分は当てはまらない。
だが、「||(OR)」の論理演算子が使われているから、どちらかの条件に合っていれば良いからif構文内の{}内の処理が行われる。
⇒「正常に作動」と表示される。
if((A<15)||(A%3==0)) {
System.out.println(“正常に作動”);
}
この式で「||(OR)」ではなく「&&(AND)」が使われていれば、条件に合わないと判断され、{}内の処理は行われない(処理が行われないだけでプログラムエラーということではない)。
trueもしくはfalseで表示
if((A<15)||(A%3==0)) {
System.out.println(“正常に作動”);
}
上の式を「true」もしくは「false」で表すには、以下のように書くことができる。
System.out.println((A<15)||(A%3==0));
これはどちらかの条件を満たしていれば「true」と表示され、どちらも満たしていなければ「false」と表示される。
ここでは両方当てはまっても「true」と表示される。
この場合は「A<15」の式を満たしているため、「true」と表示。
^ AでありBでない、BでありAでないことを表す演算子
「^」の演算子は緑色の部分だけを表す。
AでありBでなく、BでありAでないことを表す演算子で、AとBが交わっていない部分を示す。
これは何を意味するかというと、「どちらか一方だけ当てはまる」ということ。
int B=20;
System.out.println((A<13) ^ (B<15));
この式にそれぞれの値を代入すると、「A<13」は「11<13」、「B<15」は「20<15」となる。
「A<13」の式に関しては合っているが、「B<15」の式に関しては間違っている。
これは「どちらか一方が合っている」という条件に当てはまるから、このままプログラムを実行すると「true」と表示される。
もし両方間違っていたり、両方合っていたりすると、表示は「false」となる。
イメージしにくいときはとりあえずEclipseに入力だ!
まとめ
なんか調べているとビット演算子やらなんやら出てきた。
「&&」だけでなく、「&」と一つだけ使うものもあるらしい。
同様に「||」も「|」だけのものがあるみたい。
でも基本的に使うのは「&&」や「||」の方みたいだから今回は省略。
今後の学習次第で別記事にまとめようかな…。
プログラミングでも「~かつ~」とか「~または~」っていう表現ができるっていうのは高校の数学を思い出すわ。
高校の時はこの分野はちょっぴり苦手意識があったけど、その頃よりはややこしくないように感じたなー。
「あの頃よりマシ」ってレベルだけど
ここのテーマの個人的な厄介者は圧倒的に「!」の天邪鬼野郎だわ。
合ってたら間違いで、間違ってたら合ってるって…なぞなぞかよ。
と思った今日この頃。
コメント