※この記事は、論理演算と計算の優先順位に関する記事の前編です。
前回「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
(何事もなく話が戻った……) はい、その通りです。
後編に続きます。