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;
สำหรับ--ผู้ดำเนินการทุกอย่างเหมือนกันทุกประการ
GO TO FULL VERSION