
※この記事は、論理演算と計算の優先順位に関する記事の前編です。

前回「System.out.println」で色々計算しましたよね。面白かったです! 今回もカッコいいプログラム、書いていきたいです!

はい、今回もよろしくお願いします。
前回の「System.out.println」のプログラムはこちら↓↓↓
https://2nd-step.net/system-out-println/
「演算」「演算子」とは(復習)

まずは前回のおさらいです。姫野さん、「演算」「演算子」とは何でしたか?

復習はバッチリです、任せてください! 「演算」は計算のことで、「演算子」は何の計算をするかの記号、でしたよね!

その通りです。式に基づいて演算(≒計算)を行なうことを「演算」、演算の種類を指定する記号のことを「演算子」と呼びます。

見やすくするために、演算子の前と後ろに半角スペースを入れるんですよね。

仰る通りです。現時点で学ぶべき主要な演算子は以下の通りです。

算術演算子は良いとして、論理演算子に比較演算子……何だか難しそうな名前ですね……。

慣れてしまえば簡単です。一つ一つ丁寧にステップを踏んでいきましょう。
真偽値 ~「はい」のtrueと「いいえ」のfalse~

比較演算、論理演算を行なう前に、「真偽値」について触れておきましょう。

しんぎち……「真」「偽」って何ですか? マコト? ニセ?

簡単に言うと「はい」「いいえ」のことですよ。2択を表す概念です。Javaにおいては、真偽値のことをboolean(ブーリアン)値とも呼びます。

なるほど……。真偽値は「はい」「いいえ」の2択。覚えました!

ちなみに前回まででも「値」が登場しています。姫野さん、何だかわかりますか?

ええと……、数と文字ですか?

厳密に言うなら「数値」と「文字列」です。

そうそう、ダブルクォーテーションで囲むのが文字列でしたよね!

文字列と区別するために、true, falseはダブルクォーテーションで囲まないでくださいね。

わかりました!
比較演算をしてみよう

それでは比較演算の内容に入っていきましょう。

「比較演算」……って、何かを比べるんですか?

その通りです。2つの値が同じか、異なるか、大きいか、小さいかを比較するのが、比較演算です。

へー……。例えばどんなのですか?

実際にやってみましょうか。以下のプログラムを実行してみてください。
package pkg;
public class Lesson1 {
public static void main(String[] args) {
System.out.println(true == true);
System.out.println(true == false);
System.out.println(false == true);
System.out.println(false == false);
}
}
実行結果true
false
false
true
false
false
true

演算子「==」が何を意味しているか、わかりますか?

うーん……。「==」の左と右が同じかどうか……ですか? イコールの記号が使われてますし。

その通りです。「A == B」は、「AとBは同じですか」と翻訳できます。AとBが同じ場合はtrueを、異なる場合はfalseを返します。

「==」は「AとBは同じですか」……覚えました!

それでは次は、「!=」の演算子を使ったプログラムを実行してみましょう。
package pkg;
public class Lesson1 {
public static void main(String[] args) {
System.out.println(true != true);
System.out.println(true != false);
System.out.println(false != true);
System.out.println(false != false);
}
}
実行結果false
true
true
false
true
true
false

えーと……。「!=」の意味はよくわからないんですが、何か実行結果がさっきと逆になってるような……。

さすがです、よく気が付きましたね。

「!」って何なんですか? 数学で出てきた、階乗? ですか……?

論理演算のところで詳しく説明しますが、「!」は「NOT」です。

のっと。……ってことは、「!=」はノットにイコールがくっついてるから、「ノットイコール」ですか?

はい。「!=」は「ノットイコール」で合っています。具体的な意味は何だと思いますか?

わかるような、わからないような……。「!=」の左と右がノットイコールですか、だから、違ってますか、とかですか?

ご名答。「A != B」は、「AとBは異なりますか」と翻訳できます。AとBが異なる場合はtrueを、同じ場合はfalseを返します。

だから「同じですか」の演算子「==」とは逆の結果が出るんですね! 納得です。

「==」と「!=」を上手く使いこなしてくださいね。

が、頑張ります!

さて、ここまでは真偽値の比較演算を見てきましたが、数値でも比較演算ができます。
package pkg;
public class Lesson1 {
public static void main(String[] args) {
System.out.println(123 == 123);
System.out.println(123 != 123);
System.out.println(123 == 999);
System.out.println(123 != 999);
}
}

実行結果を予想してみてください。

そんなの簡単ですよ! 1行目は「123と123は同じですか」で、123と123は同じだからtrue。ってことは、2行目は逆にすればいいからfalseです! 「123と123は異なりますか」だし。

その調子です。

3行目は「123と999は同じですか」だけど、違うからfalseですね。4行目はその逆だからtrue。どうですか?
実行結果true
false
false
true
false
false
true

やったー! わたしって天才!

では次の実行結果はどうなると思いますか?
package pkg;
public class Lesson1 {
public static void main(String[] args) {
System.out.println(123 == 120 + 3);
System.out.println(123 == 12 + 3);
}
}

計算もできちゃうんですね! 1行目は文句なしのtrueですよね。

そうですね。

2行目は……前にやった「文字列結合」に見せかけた引っかけ問題ですか? でも、その手には乗りませんよ、文字列には""をつけるから! 123は15とは違うから、2行目はfalseです!
実行結果true
false
false

いいですね。次の実行結果はどうでしょう?
package pkg;
public class Lesson1 {
public static void main(String[] args) {
System.out.println(123 < 200);
System.out.println(123 > 100);
System.out.println(123 <= 123);
System.out.println(123 >= 123);
}
}

先生、どの演算子も知ってるようで知らない子です……。

数学と同じように考えてみてくださいね。数値での比較演算では「>」(大なり)・「<」(小なり)・「>=」(大なりイコール)・「<=」(小なりイコール)も使えます。

「>=」とか「<=」って、矢印的な何かかと思ってました。数学では「≧」「≦」って縦に書くけど、プログラミングでは横に書くんですね。

書き方は異なりますが、やり方は数学と同じです。

やり方は数学と同じってことは……うーんと、1行目は「123は200より小さいですか」で、2行目は「123は100より大きいですか」って意味で合ってますか?

はい。

じゃあ、どっちもtrueですね!

その通りです。3行目と4行目はどうでしょうか?

あ、わかった気がします! 3行目は「123≦123」だから、「123は123以下ですか」。4行目は「123≧123」だから「123は123以上ですか」。「123以下」にも「123以上」にも123が入ってるから、どっちもtrueで良いと思います!
実行結果true
true
true
true
true
true
true

正解です! では、以下の実行結果はどうなるでしょうか?
package pkg;
public class Lesson1 {
public static void main(String[] args) {
System.out.println(123 < 123);
System.out.println(123 > 123);
}
}

プログラムの意味は「123は123より小さいですか」と「123は123より大きいですか」ですよね? ……ええと、比べる数が同じ時はどうすればいいんでしたっけ……?

先程の <= や >= とは異なり、< や > にはイコールがついていませんね。イコールのついている「ある数以上・以下の数」には、「ある数」自身が含まれます。一方、イコールのついていない「ある数より大きい・小さい数」には、「ある数」自身が含まれません。

なるほど……? あ、よく考えてみたら、「A君はB君よりイケメン」っていう時、A君とB君のイケメン度は同じじゃないですもんね。A君のほうがB君よりイケメン度が大きい! これを表すとイケメン度は「A君 > B君」ですね! もし「A君はB君以上にイケメン」つまりイケメン度が「A君 >= B君」だったら、A君のほうがB君よりイケメンかもしれないし、2人のイケメン度が同じ可能性もあるってことですね。

(イケメン度……? いや、ツッコミは入れないでおこう)

ってことは、どっちもfalseでしょうか……?
実行結果false
false
false

(何事もなく話が戻った……) はい、その通りです。
後編に続きます。