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