1. การดำเนินการบูลีน

ตัว ดำเนินการ |และ&สามารถนำไปใช้ได้ไม่เฉพาะกับตัวเลขเท่านั้น แต่ยังรวมถึงนิพจน์บูลีนด้วย

แต่อย่างที่ทราบกันดีอยู่แล้วว่ามี&&และ||ตัวดำเนินการ ทำไมเราถึงใช้|แทน||, และ&แทน&&? มีประเด็นใด ๆ เกี่ยวกับเรื่องนี้หรือไม่? ดูเหมือนว่าจะมี บางครั้ง.

ตัว ดำเนินการ ||และ&&ตรรกะจะดำเนินการจากซ้ายไปขวาตามหลักการที่เรียกว่าlazy

(expression1) || (expression2) || (expression3)

ถ้าexpression1 เท่ากับtrueไม่มีประเด็นใดในการประเมินexpression2 และexpression3: ผลลัพธ์จะtrueไม่คำนึงถึง

ดังนั้น เมื่อประเมินนิพจน์ (ประเมินจากซ้ายไปขวา) ทันทีที่เราได้รับการtrueประเมินนิพจน์ที่เหลือจะถูกข้ามไป และถ้าexpression2 รวมexpression3การเรียกเมธอดจะไม่มีการเรียกเมธอดเหล่านี้ !

เช่นเดียวกับ&&ตัวดำเนินการเชิงตรรกะ:

(expression1) && (expression2) && (expression3)

ถ้าexpression1เท่ากับfalseไม่มีประเด็นใดในการประเมินexpression2และexpression3: ผลลัพธ์จะfalseไม่คำนึงถึง

นี่เป็นข้อเท็จจริงสำคัญที่ช่วยให้คุณเขียนสิ่งต่างๆ เช่น:

String s = null;
if (s != null && s.length() > 0) {

ตัวอย่างด้านบนจะไม่ได้รับ NullPointerException แก่คุณเพราะจะs.length()ถูกดำเนินการก็ต่อเมื่อส่วนแรกs! = nullเป็นtrue.

ถ้าsเท่ากับnullส่วนทางซ้ายของ&&ตัวดำเนินการคือfalseผลลัพธ์ของนิพจน์บูลีนทั้งหมดคือfalseดังนั้นส่วนทางขวา ( s.length() > 0) จะไม่ถูกประเมิน

ทั้งหมดที่จะพูด:

หากคุณใช้|โอเปอเรเตอร์หรือ&โอเปอเรเตอร์จะไม่มีการประเมินแบบขี้เกียจ : นิพจน์ย่อยแต่ละรายการจะได้รับการประเมินเสมอ



2. ลำดับความสำคัญของการทำงานใน Java

ดังที่คุณอาจจำได้จากชั้นเรียนคณิตศาสตร์ระดับมัธยมศึกษาตอนปลายของคุณ ตัวดำเนินการคูณมีความสำคัญมากกว่าตัวดำเนินการการบวก วงเล็บมีความสำคัญสูงกว่า: นิพจน์ในวงเล็บจะได้รับการประเมินก่อน จากนั้นจึงคูณและหาร แล้วจึงบวกและลบ

ตัวดำเนินการใน Java ก็มีลำดับความสำคัญเช่นกัน ข้อแตกต่างคือ a) มีมากกว่าเล็กน้อย b) สำหรับตัวดำเนินการบางตัว ตัวถูกดำเนินการจะถูกประเมินจากซ้ายไปขวา ในขณะที่ตัวดำเนินการอื่นๆ - จากขวาไปซ้าย

นี่คือตารางที่มีตัวดำเนินการ Java ทั้งหมด:

หมวดหมู่ โอเปอเรเตอร์ สมาคม
โพสต์ฟิกซ์ () [] . จากซ้ายไปขวา
ยูนารี ++ -- ! ~ จากขวาไปซ้าย
ทวีคูณ * / % จากซ้ายไปขวา
สารเติมแต่ง + - จากซ้ายไปขวา
ขยับ >> >>> << จากซ้ายไปขวา
เชิงสัมพันธ์ > >= < <= จากซ้ายไปขวา
ความเท่าเทียมกัน == != จากซ้ายไปขวา
บิตAND & จากซ้ายไปขวา
Exclusive OR(เอ็กซ์ออร์) ^ จากซ้ายไปขวา
บิตOR | จากซ้ายไปขวา
ตรรกะAND && จากซ้ายไปขวา
ตรรกะOR || จากซ้ายไปขวา
มีเงื่อนไข ?: จากขวาไปซ้าย
งานที่มอบหมาย = += -= *= /= %= >>= <<= &= ^= |= จากขวาไปซ้าย
เครื่องหมายจุลภาค , จากซ้ายไปขวา

บรรทัดบนสุดประกอบด้วยตัวดำเนินการที่มีความสำคัญสูงสุด วงเล็บ()ใช้เพื่อกำหนดลำดับความสำคัญอย่างชัดเจน วงเล็บเหลี่ยม[]ใช้เพื่อเข้าถึงองค์ประกอบที่ดัชนีเฉพาะของตัวแปรอาร์เรย์ ตัวดำเนินการจุด ( .) ใช้เพื่อเข้าถึงฟิลด์และวิธีการโดยใช้การอ้างอิงไปยังวัตถุหรือคลาส

ยิ่งตัวดำเนินการอยู่ในตารางต่ำเท่าใด ลำดับความสำคัญก็จะยิ่งต่ำลงเท่านั้น

หากคุณใช้ตัวดำเนินการหลายตัวในนิพจน์ อย่าขี้เกียจ: เพิ่มวงเล็บ

ใน Java คุณสามารถเขียนบางอย่างเช่นif (a & 1<< b > ~c)แต่คุณไม่ควรเขียน คุณกำลังเขียนโค้ดไม่เพียงแต่สำหรับคอมไพเลอร์เท่านั้น แต่ยังสำหรับโปรแกรมเมอร์คนอื่นๆ ด้วย ยิ่งอ่านโค้ดได้มากเท่าไหร่ก็ยิ่งดีเท่านั้น



3. คำนำหน้าและคำนำหน้าที่เพิ่มขึ้น

ดังที่คุณทราบแล้ว Java มีตัวดำเนินการเพิ่ม ( ++) และตัวดำเนินการลด ( --) โดยจะเพิ่มและลดค่าของตัวแปรตาม1ลำดับ

สิ่งที่คุณอาจไม่ทราบก็คือมีตัวดำเนินการเหล่านี้อยู่ 2 ประเภท: คำนำหน้า (ตัวดำเนินการวางไว้ก่อนตัวแปร) และ postfix (ตัวดำเนินการวางไว้หลังตัวแปร) และตัวดำเนินการสองประเภททำงานแตกต่างกันเล็กน้อย

ใน Java คุณสามารถเขียนนิพจน์ได้ดังนี้:

int a = 5;
int b = a++;

หาก โอเปอเรเตอร์ปรากฏหลังตัวแปรและตัวแปรเป็นส่วนหนึ่งของนิพจน์ (ตามตัวอย่าง ด้าน++บน) นิพจน์จะใช้ค่าปัจจุบันของตัวแปร และหลังจากนั้นตัวแปรจะเพิ่มขึ้น1

กล่าวอีกนัยหนึ่งสิ่งนี้จะเกิดขึ้น:

int a = 5;
int b = a;
a = a + 1;

นั่นคือbจะเป็น5ไม่ใช่6อย่างที่คุณคิดในตอนแรก

ถ้า++โอเปอเรเตอร์อยู่หน้าตัวแปรและตัวแปรเป็นส่วนหนึ่งของนิพจน์ ค่าจะถูกเพิ่มก่อน1และหลังจากนั้นจะใช้ค่าในนิพจน์

int a = 5;
int b = ++a;

ตัวอย่างข้างต้นเทียบเท่ากับตัวอย่างต่อไปนี้:

int a = 5;
a = a + 1;
int b = a;

ที่นี่, bจะเท่ากับ6.

มีแม้แต่ตัวอย่างที่โปรแกรมเมอร์ Java ใช้ในการพิจารณาว่าคนอื่นเป็นโปรแกรมเมอร์ Java ด้วยหรือไม่:

int a = 5;
int b = ++a + ++a;

ใช่คุณสามารถเขียนได้เช่นกัน

ตัวอย่างนี้จะรวบรวมได้ดีและกลายเป็นดังนี้:

int a = 5;

a = a + 1;
int v1 = a;

a = a + 1;
int v2 = a;

int b = v1 + v2;

สำหรับ--ผู้ดำเนินการทุกอย่างเหมือนกันทุกประการ