1. นิพจน์ vs คำสั่ง

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

ข้อแตกต่างหลักระหว่างคำสั่งและนิพจน์ คือการประเมินนิพจน์มีผล และผลลัพธ์นี้มีประเภท และสามารถกำหนดให้กับตัวแปรหรือใช้ในนิพจน์อื่น

ตัวอย่าง:

รหัส หมายเหตุ
int x; คำแถลง
(a < 10) นิพจน์ที่เป็นประเภทboolean
i++; นิพจน์ที่มีประเภทเหมือนกับประเภทของiตัวแปร
x = 5; นิพจน์ที่มีประเภทเหมือนกับประเภทของxตัวแปร

และสิ่งนี้ให้อะไรเราบ้าง?

ขั้นแรก เราสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่าข้อความจำนวนมากเป็นนิพจน์ ตัวอย่างเช่น โค้ดแบบนี้จะใช้งานได้:

รหัส หมายเหตุ
int x, y, z;
x = y = z = 1;
int x, y, z;
x = (y = (z = 1))

ประการที่สอง หากเราต้องการ เราสามารถเพิกเฉยต่อผลลัพธ์ของการประเมินนิพจน์ได้

รหัส รหัสที่เราเพิกเฉยต่อผลลัพธ์:
int x = scanner.nextInt();
boolean m = (5 < 10);
scanner.nextInt();
(5 < 10);

เราไม่สนใจผลลัพธ์ของการประเมินนิพจน์ ตัวอย่างเช่น หากนิพจน์เกี่ยวข้องกับการทำสิ่งที่มีประโยชน์ และการกระทำนี้เป็นสิ่งสำคัญสำหรับเรา ไม่ใช่ตัวผลลัพธ์เอง


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");