[TH] Arduino: Expression

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

y = 4/x2

สามารถเขียนด้วยภาษา C++ ได้ดังนี้

float x;
float y;
y = 4/x*x;

หรือ

float x,y;
y = 4/(x*x);

แบบใดถูกต้อง

ลำดับความสำคัญ

ลำดับความสำคัญในการกระทำนิพจน์เป็นดังนี้

  • ทำในเครื่องหมายวงเล็บในสุดก่อน
  • ทำ * หรือ / หรือ % โดยทำจากซ้ายไปขวา
  • ทำ + หรือ – โดยทำจากซ้ายไปขวา

ด้วยเหตุนี้ ถ้าให้ x = 4.5 เมื่อคำนวณสมการ y = 4/x2 จะได้คำตอบของ 4/4.52 เป็น 0.19753086419753085 แต่ถ้าทำตามนิพจน์ที่เขียนด้วยภาษา C++ ตามตัวอย่างก่อนหน้านี้จะได้โค้ดและผลลัพธ์ดังนี้

กรณีที่ 1

void setup() {
  float x=4.5;
  float y;
  Serial.begin(115200);
  y=4/x*x;
  Serial.println(y);
}

void loop() {
}

กรณีที่ 2

void setup() {
  float x=4.5;
  float y;
  Serial.begin(115200);
  y=4/(x*x);
  Serial.println(y);
}

void loop() {
}

จาก 2 กรณีจะพบว่า กรณีที่ 2 ให้คำตอบที่ถูกต้องใกล้เคียงกับการคำนวณจากสมการคณิตศาสตร์ และกรณีที่ 1 นั้นมีลำดับการคำนวณที่ผิดพลาด คือ นำ 4 หารด้วย x หลังจากนั้นนำผลลัพธ์จากการหารคูณด้วย x ทั้งนี้เนื่องจากเครื่องหมาย * และ / มีลำดับการทำงานที่เท่ากันจึงทำจากซ้ายไปขวา แต่กรณีที่ 2 ใช้วงเล็บบังคับให้คำนวณ x*x หรือ x2 ก่อน แล้วนำ 4 หารด้วยค่าที่ยกกำลังสองแล้วจึงเป็นการคำนวณที่ถูกลำดับตามสมการคณิตศาสตร์

กรณีใช้เครื่องหมายดำเนินการผลายแบบผสมกันจะมีลำดับความสำคัญเรียงกันดังนี้

ลำดับเครื่องหมาย
1( )
2* / %
3+ –
4== != < > <= >=
5!
6&&
7||

สรุป

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

(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุง 2021-05-25, 2021-09-20