1. นิพจน์ vs คำสั่ง
ในภาษาจาวา การแยกแยะระหว่างสองประเภทจะเป็นประโยชน์: ข้อความสั่งและนิพจน์ คำสั่งมักจะถูกเรียกใช้งานในขณะที่นิพจน์จะถูกประเมิน แต่นั่นไม่ใช่สิ่งที่สำคัญที่สุด
ข้อแตกต่างหลักระหว่างคำสั่งและนิพจน์ คือการประเมินนิพจน์มีผล และผลลัพธ์นี้มีประเภท และสามารถกำหนดให้กับตัวแปรหรือใช้ในนิพจน์อื่น
ตัวอย่าง:
รหัส | หมายเหตุ |
---|---|
int x; |
คำแถลง |
(a < 10) |
นิพจน์ที่เป็นประเภทboolean |
i++; |
นิพจน์ที่มีประเภทเหมือนกับประเภทของi ตัวแปร |
x = 5; |
นิพจน์ที่มีประเภทเหมือนกับประเภทของx ตัวแปร |
และสิ่งนี้ให้อะไรเราบ้าง?
ขั้นแรก เราสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่าข้อความจำนวนมากเป็นนิพจน์ ตัวอย่างเช่น โค้ดแบบนี้จะใช้งานได้:
รหัส | หมายเหตุ |
---|---|
|
|
ประการที่สอง หากเราต้องการ เราสามารถเพิกเฉยต่อผลลัพธ์ของการประเมินนิพจน์ได้
รหัส | รหัสที่เราเพิกเฉยต่อผลลัพธ์: |
---|---|
|
|
เราไม่สนใจผลลัพธ์ของการประเมินนิพจน์ ตัวอย่างเช่น หากนิพจน์เกี่ยวข้องกับการทำสิ่งที่มีประโยชน์ และการกระทำนี้เป็นสิ่งสำคัญสำหรับเรา ไม่ใช่ตัวผลลัพธ์เอง
2. ตัวดำเนินการแบบไตรภาค
การแฮ็กชีวิตนี้น่าสนใจกว่าครั้งก่อนอยู่แล้ว Java มีตัวดำเนินการternary พิเศษ ไวยากรณ์ของมันค่อนข้างคล้ายกับไวยากรณ์ของคำสั่ง:if-else
Condition ? Expression 1 : Expression 2;
หากเงื่อนไขเป็นจริงนิพจน์ 1จะได้รับการประเมิน มิฉะนั้นนิพจน์ 2จะได้รับการประเมิน เงื่อนไขจะตามด้วยเครื่องหมายคำถามและนิพจน์ทั้งสองคั่นด้วยเครื่องหมายทวิภาค
ข้อแตกต่างหลักระหว่างตัวดำเนินการแบบไตรภาคและif-else
คำสั่งคือตัวดำเนินการแบบไตรภาคเป็นนิพจน์ ซึ่งหมายความว่าเราสามารถกำหนดผลลัพธ์ให้กับบางสิ่งได้
ตัวอย่างเช่น สมมติว่าเราต้องการคำนวณจำนวนขั้นต่ำสองตัว เมื่อใช้ตัวดำเนินการ ternary รหัสนี้จะมีลักษณะดังนี้:
int a = 2;
int b = 3;
int min = a < b ? a : b;
หรือสมมติว่าคุณต้องกำหนดค่าต่างๆ ให้กับตัวแปรโดยขึ้นอยู่กับเงื่อนไขบางอย่าง คุณทำอย่างนั้นได้อย่างไร?
ทางเลือกหนึ่งคือการใช้if-else
คำสั่ง:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
ตัวเลือกที่สองคือการใช้ตัวดำเนินการ ternaryนั่นคือชวเลขสำหรับif-else
คำสั่ง:
int age = 25;
int money = age > 30 ? 100 : 50;
อันไหนดีกว่าที่จะใช้ - if-else
คำสั่งหรือตัวดำเนินการที่ประกอบไปด้วย ternary ? ในแง่ของความเร็วในการดำเนินการ ไม่มีความแตกต่างกันมากนัก นี่เป็นเรื่องของการอ่านรหัสมากกว่า และนี่คือจุดที่สำคัญมาก: โค้ดต้องไม่เพียงทำงานได้อย่างถูกต้องเท่านั้น แต่ยังต้องง่ายต่อการอ่านสำหรับโปรแกรมเมอร์คนอื่นๆ ด้วย
กฎที่ ง่ายที่สุดคือ: ถ้ารหัสพอดีกับหนึ่งบรรทัดให้ใช้ตัวดำเนินการแบบไตรภาค แต่ถ้าไม่พอดีกับบรรทัดเดียวก็ควรใช้if-else
คำสั่ง
3. การเปรียบเทียบจำนวนจริง
ดังที่ได้กล่าวไว้ก่อนหน้านี้ คุณไม่สามารถเพียงแค่คว้าตัวเลขจริงมาเปรียบเทียบได้ มีความเป็นไปได้เสมอที่ตัวเลขสำคัญบางหลักอาจถูกทิ้ง ทำให้เกิดผลข้างเคียงที่ไม่คาดคิด
นั่นเป็นเหตุผลที่มีวิธีการทดสอบตามเวลา หากจำนวนจริงสองตัวแตกต่างกันด้วยค่าที่น้อยมาก ก็จะถือว่าเท่ากัน ตัวอย่าง:
double a = 1.000001;
double b = 1.000002;
if ( (b - a) < 0.0001 )
System.out.println("The numbers are equal");
else
System.out.println("The numbers are not equal");
แต่นั่นไม่ใช่ทั้งหมดที่เราต้องกังวล เนื่องจากผลต่างระหว่างตัวเลขอาจกลายเป็นลบได้ เพื่อให้วิธีนี้ได้ผล คุณต้องเปรียบเทียบไม่เพียงแค่ความแตกต่างระหว่างตัวเลขเท่านั้น แต่รวมถึงค่าสัมบูรณ์ของความแตกต่างระหว่างตัวเลขด้วย:|a-b|
Java มีวิธีการคำนวณค่าสัมบูรณ์ของตัวเลข: Math.abs()
:
int m = Math.abs(value);
ด้วยเหตุนี้ ตัวอย่างเวอร์ชันที่ได้รับการแก้ไขข้างต้นจะมีลักษณะดังนี้:
double a = 1.000001;
double b = 1.000002;
if ( Math.abs(b - a) < 0.0001 )
System.out.println("The numbers are equal");
else
System.out.println("The numbers are not equal");
GO TO FULL VERSION