追記 2020/3/6 @shiracamusさんより大幅な編集リクエストをいただきましたので、そちらに差し替えさせていただきます。
(旧記事は本当に自分用の備忘録として、限定投稿の方に残しました)
追記 2020/3/6
条件演算子の末尾にセミコロンが必須と書いた内容について、ご指摘いただいたので訂正。いつもありがとうございます。
はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
間違えたものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。
環境
言語:Java11、JDK13.0.2
動作環境:Windows10
論理演算子
論理演算子(Logical Operator)とは、前回挙げた条件や関係演算子を使いつつ、より複雑な条件の記述を行う場合に用いられる演算子。今回は「オペランド(項)をいくつとる演算子なのか」を書く。オペランドを2つとる演算子を二項演算子、オペランドを一つしかとらないものを単項演算子という。オペランドには式を書く。
-
&&
:右項 && 左項
論理積。二項演算子。
右項と左項の式を評価し、いずれもtrueのときtrueを返す。
ただし、まず右項を評価してから左項を評価する。右項がfalseのときは左項を評価しない。これを短絡評価という。 -
||
:右項 || 左項
論理和。二項演算子。
右項と左項の式を評価し、どちらかがtrueのときtrueを返す。
ただし、まず右項を評価してから左項を評価する。右項がtrueのときは左項を評価しない。&&
同様に短絡評価である。 -
!
:! 単項
論理否定。単項演算子。
**単項の式の評価結果**がfalseのときtrueを返し、trueのときfalseを返す。
数学の「集合」でよく見かけたベン図を用いると、真理値がどうなっているか分かるだろう。下手で申し訳ないが、一応用意した。(最重要課題:作図能力)
緑 && 赤 :trueは青
緑 || 赤:trueは灰を除いてすべて
!(灰):赤青緑
となる。
(本当は青はゆがんでいるのではないかなどのご指摘は、すみません)
論理演算子の間違い実践
import java.io.*;
class digitForture
{
public static void main(String[] args) throws IOException
{
System.out.println("好きな一桁の数字を入力してください。");
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int digit = Integer.parseInt(str);
if(digit > 10 && digit <= -1){
System.out.println("一桁までの数字を入力してください。");
//ん?
}
else{
System.out.println("あなたの数字は" + digit + "ですね?");
System.out.println("今から調べますので少々お待ちください...。");
}
}
...//以降省略。占いに用いる、一桁の数字と紐づいた運勢表を用意したとする。
このままだと、せっかく用意した論理演算が有効でないので、ちゃんと**&&
を||
に**しなければならない。
自分が論理積を扱っているのか、論理和を扱っているのか。思考を整理するためにもベン図を(見やすく)作る練習がとても必要だと感じた。
条件演算子
条件演算子とは、オペランドを3つとり、条件式の評価結果に対して trueのときの式 と falseのときの式 を書くことができ、どちらかの式の評価結果を返す。もう一方の式は評価しない。
「条件式」のあとに、「?
」と「trueのときの式」を書き、そのあとに「:
」と「falseのときの式」を書く。
条件式 ? trueのときの式 : falseのときの式
注意点が一つ。引用文では末尾の;(セミコロン)がない。
必ず入れなければならない。
2020/3/6追記:文中で条件として使うこともできるため、かならずしも入れる必要はない。
本当にセミコロンが必要なのは文末。これはこの演算子に限らない。
(コンパイルエラーで弾かれるのでさほど恐れる必要もない。最初の頃はよく弾かれることにいら立っていた。今は「弾いてくれて助かる」と感じている)
おわりに
パンかケーキかを判別する「pancakeSearch.java」を思いついたが、以下の問題を抱えている。
- パンかケーキかを判別する根拠として、そのためのリストを作る必要がある。
- 入力を受け付けたあと、リストをサーチして結果をだす機構について調べる必要がある。
- そもそもパンケーキは「パン+ケーキ」ではなく、「pan(英語の鍋)+cake」であり、多分ケーキ。
参考
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。