ตัวดำเนินการเชิงตรรกะ - 1

“สวัสดี อามีโก้!”

"ตอนนี้ เราจะมีบทเรียนเล็กๆ น้อยๆ เกี่ยวกับตัวดำเนินการเชิงตรรกะ"

"คุณรู้จักตัวดำเนินการเชิงตรรกะอะไรบ้าง"

— หรือ (||) และ (&&) ไม่ใช่(!)

"ใช่ ทำได้ดีมาก คุณจำวิธีการทำงานได้ไหม"

"ใช่."

"OR ให้ผลจริงเมื่อตัวถูกดำเนินการอย่างน้อยหนึ่งตัวเป็นจริง"

"AND เป็นจริงเมื่อตัวถูกดำเนินการทั้งสองเป็นจริง"

"ไม่เปลี่ยนจริงเป็นเท็จ และเท็จเป็นจริง"

"ถูกต้องแล้ว ตัวดำเนินการได้รับการประเมินในนิพจน์นี้ในลำดับใด"

boolean a = true;
boolean b = false;
boolean c = true;

boolean result = a && b || !c && b || !a;

"ทั้งหมดนี้ง่ายมาก"

"อันดับแรก ไม่ใช่ (!) จากนั้น AND (&&) และ OR (||) ที่ส่วนท้ายสุด"

ถ้าเราใส่วงเล็บเข้าไป เราจะได้:

boolean a = true;
boolean b = false;
boolean c = true;

boolean result = (a && b) || ((!c) && b) || (!a);

"ถูกต้อง เรียบร้อยดี ผลเป็นอย่างไร"

— 1) (a && b) == (จริง && เท็จ) == เท็จ

2) ((!c) && b) == (เท็จ && เท็จ) == เท็จ

3) (!a) == เท็จ

4) เท็จ || เท็จ || เท็จ == เท็จ

"ผลลัพธ์เป็นเท็จ"

"ดูเหมือนว่าคุณจะรู้เรื่องนี้เป็นอย่างดี ถ้าอย่างนั้นฉันจะบอกความลับเล็กๆ น้อยๆ ให้คุณฟัง"

"ขั้นแรก นิพจน์เชิงตรรกะจะถูกประเมินจากซ้ายไปขวา"

"ประการที่สอง ใช้การประเมินการลัดวงจรที่นี่ (การคำนวณจะดำเนินการในกรณีที่จำเป็นเท่านั้น) หากทราบผลลัพธ์สุดท้ายจากการประเมินส่วนหนึ่งของนิพจน์แล้ว นิพจน์ที่เหลือจะไม่ถูกประเมิน"

ตัวอย่าง
boolean result = (true && false) || (true && true) || (true && false);

"นิพจน์นี้แบ่งออกเป็นสามส่วนโดยคั่นด้วยตัวดำเนินการ OR (||)"

"ถ้าอย่างน้อยหนึ่งส่วนเป็นจริง คำตอบจะเป็นจริงและไม่ต้องพิจารณาอย่างอื่น ดังนั้น นิพจน์จะถูกประเมินดังนี้:"

1)  ประเมินส่วนแรก:  (จริง && เท็จ) == เท็จ

2)  ประเมินส่วนที่สอง:  (จริง && จริง) == จริง

3)เราไม่ประเมินส่วนที่สาม เนื่องจากเป็นที่ชัดเจนอยู่แล้วว่าคำตอบจะเป็นจริง .

"วิธีนี้เรียกอีกอย่างว่าการประเมินแบบขี้เกียจ"

"ตกลง แล้วมันพิเศษยังไงล่ะ?"

"ไม่มีอะไร - จนกว่าคุณจะเริ่มเรียกใช้เมธอดภายในนิพจน์ ถ้าบางส่วนของนิพจน์ถูกข้ามไป เมธอดในส่วนที่ถูกข้ามจะไม่ถูกเรียกใช้"

"แต่วิธีการนี้กลายเป็นเรื่องธรรมดาไปแล้ว นี่คือเหตุผล:"

ตัวอย่าง:
Job job = null;

if (job != null && job.isDone())
{}

"หากงานเป็นโมฆะเมื่อนิพจน์ได้รับการประเมิน การเรียก job.isDone() จะไม่เกิดขึ้น!"

"แท้จริงแล้ว ส่วนแรกของนิพจน์เป็นเท็จ ซึ่งตามด้วย AND (&&) ดังนั้น นิพจน์ทั้งหมดจะเป็นเท็จ และส่วนที่สองก็ไม่จำเป็น"

“แน่นอน มันเป็นเทคนิคที่ดีใช่ไหม”

"ใช่."