3 ตัวดำเนินการ
วัตถุประสงค์
เพื่อให้เข้าใจเกี่ยวกับนิพจน์ ตัวดำเนินการ และตัวถูกดำเนินการ
เพื่อให้เข้าใจลำดับความสำคัญของตัวดำเนินการ
เพื่อให้สามารถสร้างนิพจน์และใช้ตัวดำเนินการที่เหมาะสมในการเขียนโปรแกรมได้
โปรแกรมคอมพิวเตอร์ส่วนใหญ่มีการดำเนินการกับข้อมูลเพื่อให้ได้ผลลัพธ์ตามที่ต้องการโดยการสร้างนิพจน์ที่ประกอบไปด้วยตัวดำเนินการและตัวถูกดำเนินการ ผลลัพธ์ที่ได้มีหลายรูปแบบ เช่น ตัวเลข ข้อความ ค่าทางตรรกศาสตร์ เป็นต้น
3.1 นิพจน์ ตัวดำเนินการ และตัวถูกดำเนินการ
นิพจน์ (expression) คือ สิ่งที่สร้างผลลัพธ์และให้ค่าคืนกลับมา ซึ่งหมายถึงการนำตัวแปรหรือค่ามาสัมพันธ์กันด้วยเครื่องหมายการคำนวณ (เช่น + - * / ) หรือเครื่องหมายเปรียบเทียบ (เช่น > < = ) หรือเครื่องหมายทางตรรกะ (เช่น และ (&&), หรือ (||), นิเสธ (!) เป็นต้น ตัวอย่างเช่น
จากตัวอย่างข้างต้น x + y คือ นิพจน์
a+b%5-1*c เป็นตัวอย่างของนิพจน์การคำนวณให้ค่าเป็นตัวเลข และ (a>b) || (m>n) เป็นตัวอย่างของนิพจน์ตรรกะให้ค่าเป็นค่าความจริงทางตรรกศาสตร์ คือ true เมื่อค่าความจริงเป็นจริง หรือ false เมื่อค่าความจริงเป็นเท็จ
ตัวถูกดำเนินการ (operand) คือค่าที่ใช้ในการสร้างผลลัพธ์ ซึ่งหมายถึงค่าหรือตัวแปรในนิพจน์ที่ถูกดำเนินการด้วยตัวดำเนินการ เช่น นิพจน์ x + y ตัวแปร x และ y คือตัวถูกดำเนินการเพราะนิพจน์นำค่า x และ y มาดำเนินการบวกกันเพื่อให้ได้ผลลัพธ์คือผลบวกของค่าในตัวแปรทั้งสอง
ตัวดำเนินการ (operator) คือ สัญลักษณ์ซึ่งกระทำกับค่าตั้งแต่ 1 ค่าขึ้นไปเพื่อสร้างผลลัพธ์ออกมา ตัวดำเนินการแบ่งเป็น 4 ประเภทหลัก คือ
ตัวดำเนินการคำนวณ (arithmetic operators)
ตัวดำเนินการกำหนดค่า (assignment operators)
ตัวดำเนินการตรรกะ (logical operators)
ตัวดำเนินการสัมพันธ์ (relational operators)
3.2 ตัวดำเนินการคำนวณ
ตัวดำเนินการคำนวณเป็นตัวดำเนินการในการคำนวณทางคณิตศาสตร์ ซึ่งมีสัญลักษณ์ดังตารางที่ 3.1
ตารางที่ 3.1 ตัวดำเนินการคำนวณ
เครื่องหมาย | การดำเนินการ | ตัวอย่างการใช้งาน |
---|---|---|
+ | บวก | z = x + y |
- | ลบ | z = x – y |
* | คูณ | z = x * y |
/ | หาร | z = x / y |
% | หารเอาเศษ (modulus) | z = x % y |
จากตัวอย่างที่ 3.1 บรรทัดที่ 11 ตัวแปร a มีค่าเท่ากับ 6% (1+3) เท่ากับ 6%4 ผลลัพธ์ที่ได้คือ 2 เนื่องจาก 6 หาร 4 เท่ากับ 1 เศษ 2 เครื่องหมาย % เป็นการหารเอาเศษทำให้ได้ผลลัพธ์เท่ากับ 2
จากตัวอย่างที่ 3.2 ตัวแปร x, y และ z เป็นตัวเลขจำนวนเต็มทำให้เมื่อนำมาดำเนินการหารกันผลลัพธ์ ที่ได้คือ 0 ซึ่งเป็นตัวเลขจำนวนเต็ม ดังนั้นข้อสังเกตสำคัญคือข้อมูลหรือตัวแปรชนิดเดียวเมื่อนำมาดำเนินการกันย่อมทำให้ได้ผลลัพธ์ที่เป็นชนิดเดียวกันด้วย
จากตัวอย่างที่ 3.3 ผลลัพธ์ที่เก็บในตัวแปร result จะมีค่าเท่ากับ 4 อธิบายได้ดังนี้
\[ \begin{aligned} \text { result } & =((2 * 4) / 3) * 2 \\ & =(8 / 3) * 2 \\ & =2 * 2 \\ & =4 \end{aligned} \]
จากตัวอย่างที่ 3.4 ผลลัพธ์ของโปรแกรมอธิบายได้ดังนี้ 11%3 ได้ผลลัพธ์เท่ากับ 2 เนื่องจาก 11 หาร 3 ได้ผลหารเป็น 3 เศษ 2
นอกจากนี้ตัวดำเนินการคำนวณที่กล่าวไปแล้วในภาษาจาวายังมีตัวดำเนินการแบบเพิ่มหรือลดทีละหนึ่ง ดังตารางที่ 3.2
ตารางที่ 3.2 ตัวดำเนินการแบบเพิ่มหรือลดทีละหนึ่ง
เครื่องหมาย | การดำเนินการ | ตัวอย่างการใช้งาน | การทำงาน |
---|---|---|---|
++ | เพิ่มค่าทีละหนึ่ง | y = ++x | เพิ่มค่าก่อน |
y = x++ | เพิ่มค่าทีหลัง | ||
– | ลดค่าทีละหนึ่ง | y = –x | ลดค่าก่อน |
y = x– | ลดค่าหลัง |
ตารางที่ 3.3 ตัวอย่างการใช้งานตัวดำเนินการแบบเพิ่มหรือลดทีละหนึ่ง
ตัวอย่างการใช้งาน | ความหมาย |
---|---|
y = ++x | บวกค่าในตัวแปร x เพิ่มขึ้นอีกหนึ่งก่อนที่จะกำหนดค่า x ให้กับตัวแปร y |
y = x++ | กำหนดค่า x ให้กับตัวแปร y ก่อนที่จะบวกค่าในตัวแปร x เพิ่มขึ้น 1 (บวกค่าให้กับตัวแปร x เพิ่มขึ้นอีกหนึ่งทีหลัง) |
y = –x | ลบค่าในตัวแปรx ลงหนึ่งก่อนที่จะกำหนดค่า x ให้กับตัวแปร y |
y = x– | กำหนดค่า x ให้กับตัวแปร y ก่อนที่จะลบค่าในตัวแปร x ลดลงหนึ่ง (ลบค่าให้กับตัวแปร x ลดลงหนึ่งทีหลัง) |
จากตัวอย่างที่ 3.5 กำหนดให้เริ่มต้นตัวแปร x มีค่าเท่ากับ 1 ผลการดำเนินงานจากคำสั่งบรรทัดที่ 5 มีการเพิ่มค่าให้ตัวแปร x อีก 1 ก่อนแล้วจึงกำหนดค่าให้ตัวแปร y ทำให้ทั้งตัวแปร x และ y มีค่าเท่ากับ 2 แต่คำสั่งในบรรทัดที่ 7 นำค่าในตัวแปร x คือ 2 ไปกำหนดค่าให้ตัวแปร y ก่อนจึงค่อยเพิ่มค่า x อีก 1 ทีหลังทำให้ y มีค่าเท่ากับ 2 และเมื่อทำการเพิ่มค่า x ทำให้ตัวแปร x มีค่าเพิ่มขึ้นเป็น 2 การดำเนินการ – ในบรรทัดที่ 9 จะทำการลดค่า x ลง 1 ก่อนแล้วจึงกำหนดค่าให้ตัวแปร y แต่ในบรรทัดที่ 11 จะนำค่า x ไปกำหนดค่าให้ y ก่อนแล้วค่อยลดค่า x อีก 1 ทีหลัง
จากตัวอย่างที่ 3.6 เริ่มต้นกำหนดให้ x = 1 โปรแกรมในบรรทัดที่ 5 ก่อนการพิมพ์ค่า x ออกทางจอภาพจะดำเนินการเพิ่มค่า x ก่อนดังนั้นผลลัพธ์ที่แสดงออกมาคือ x = 2 และในบรรทัดที่ 6 เมื่อพิมพ์ค่า x จะเห็นได้ว่าค่า x เปลี่ยนไปเป็น 2 แล้ว แต่สำหรับบรรทัดที่ 7 ผลการพิมพ์จะพิมพ์ค่า x = 2 เนื่องจากการดำเนินการลดค่า x จะทำทีหลังการพิมพ์ค่า x หลังจากทำคำสั่งบรรทัดที่ 7 แล้ว บรรทัดที่ 8 ผลการพิมพ์ค่า x ออกทางจอภาพคือ x = 1 จะเห็นได้ว่าค่าตัวแปร x มีการลดค่าลงแล้ว
3.3 ตัวดำเนินการกำหนดค่า
ตัวดำเนินการกำหนดค่าเป็นสัญลักษณ์ในการกำหนดค่าให้กับตัวแปรและอ็อบเจกต์ ดังตารางที่ 3.4
ตารางที่ 3.4 ตัวดำเนินการกำหนดค่า
เครื่องหมาย | ตัวอย่างการใช้งาน | ความหมาย |
---|---|---|
= | y = x | เป็นการนำค่าในตัวแปร x ไปกำหนดค่าให้กับตัวแปร y |
+= | y += x | มีความหมายเหมือนกับ y = y + x |
มีการดำเนินการ คือ นำค่าในตัวแปร y บวกกับค่าในตัวแปร x แล้วนำผลลัพธ์ที่ได้ไปกำหนดค่าให้ y เป็นค่าใหม่ |
||
-= | y -= x | มีความหมายเหมือนกับ y = y - x |
*= | y *= x | มีความหมายเหมือนกับ y = y * x |
/= | y /= x | มีความหมายเหมือนกับ y = y / x |
%= | y %= x | มีความหมายเหมือนกับ y = y % x |
จากตัวอย่างที่ 3.7 โปรแกรมบรรทัดที่ 4 เป็นการประกาศและกำหนดค่าให้ x = 3 และ y = 6 บรรทัดที่ 5 เป็นการนำค่า y + x ซึ่งมีค่าเท่ากับ 6 + 3 ได้ผลลัพธ์คือ 9 นำค่า 9 ไปกำหนดค่าให้ตัวแปร y ดังนั้นเมื่อสิ้นสุดคำสั่งบรรทัดที่ 5 ตัวแปร y จะเปลี่ยนค่าไปเป็น 9 คำสั่งบรรทัดที่ 7 เป็นการนำค่า y / x ซึ่งมีค่าเท่ากับ 9 / 3 ได้ผลลัพธ์คือ 3 นำค่า 3 ไปกำหนดค่าให้ตัวแปร y ดังนั้นเมื่อสิ้นสุดคำสั่งบรรทัดที่ 7 ตัวแปร y จะเปลี่ยนค่าไปเป็น 3 และคำสั่งบรรทัดที่ 9 เป็นการนำค่า y % x ซึ่งมีค่าเท่ากับ 3 / 3 ได้ผลลัพธ์คือ 0 นำค่า 0 ไปกำหนดค่าให้ตัวแปร y ดังนั้นเมื่อสิ้นสุดคำสั่งบรรทัดที่ 9 ตัวแปร y จะเปลี่ยนค่าไปเป็น 0
3.4 ตัวดำเนินการสัมพันธ์
ตัวดำเนินการเปรียบเทียบเป็นสัญลักษณ์แทนการดำเนินการที่นำข้อมูล 2 ค่ามาเปรียบเทียบกัน ผลการเปรียบเทียบจะให้ค่าความจริงเป็นจริง (true) หรือเท็จ (false) เท่านั้น ตัวดำเนินการเปรียบเทียบเป็นดังตารางที่ 3.5
ตารางที่ 3.5 ตัวดำเนินการเปรียบเทียบ
เครื่องหมาย | การเปรียบเทียบ | ตัวอย่างการใช้งาน |
---|---|---|
== | เท่ากับ | x == y |
!= | ไม่เท่ากับ | x != y |
< | น้อยกว่า | x < y |
<= | น้อยกว่าหรือเท่ากับ | x<= y |
> | มากกว่า | x > y |
>= | มากกว่าหรือเท่ากับ | x >= y |
การดำเนินการเปรียบเทียบข้อความหรือ String สามารถใช้เมท็อด equals ซึ่งจะให้ค่าเป็น true ถ้าข้อความเหมือนกัน และให้ค่าเป็น false ถ้าข้อความต่างกัน ดังตัวอย่างที่ 3.9
3.5 ตัวดำเนินการตรรกะ
ตัวดำเนินการตรรกะใช้เพื่อเชื่อมนิพจน์ตรรกะเข้าด้วยกันแล้วทำให้ได้ผลเป็นนิพจน์ตรรกะใหม่ ซึ่งผลลัพธ์ที่ได้จะให้ค่าความจริงเป็นจริง (true) หรือเท็จ (false) เท่านั้น ตัวดำเนินการตรรกะเป็นดังตารางที่ 3.6 และตารางค่าความจริงเป็นดังตารางที่ 3.7
ตารางที่ 3.6 ตัวดำเนินการตรรกะ
เครื่องหมาย | ความหมาย |
---|---|
&& | และ |
|| | หรือ |
! | นิเสธ |
ตารางที่ 3.7 ตารางค่าความจริงทางตรรกศาสตร์
TRUE | FALSE | true && false | true || false | !true | !false |
---|---|---|---|---|---|
FALSE | FALSE | FALSE | FALSE | TRUE | TRUE |
FALSE | TRUE | FALSE | TRUE | TRUE | FALSE |
TRUE | FALSE | FALSE | TRUE | FALSE | TRUE |
TRUE | TRUE | TRUE | TRUE | FALSE | FALSE |
จากตารางที่ 3.7 กรณีดำเนินการและ (&&) ค่าความจริงจะเป็นจริงกรณีเดียว คือ true && true ส่วนการดำเนินการหรือ (||) จะให้ค่าเป็นเท็จในกรณีเดียว คือ false || false
จากตัวอย่างที่ 3.11 อธิบายการทำงานของโปรแกรมได้ดังนี้
3 > 6 ผลลัพธ์คือ false
3>=6 ผลลัพธ์คือ false
3 < 6 ผลลัพธ์คือ true
3<=6 ผลลัพธ์คือ true
3==6 ผลลัพธ์คือ false
3 !=6 ผลลัพธ์คือ true
(3==3) && (6!=6) ได้ค่าความจริงคือ
true && false ผลลัพธ์คือ false
(3==3) || (6!=6) ได้ค่าความจริงคือ true || false ผลลัพธ์คือ true
!(3!=6) ได้ค่าความจริงคือ !true ผลลัพธ์คือ false
3.6 ลำดับความสำคัญของตัวดำเนินการ
ภาษาจาวากำหนดความสำคัญหรือการทำก่อน (precedence) เพื่อกำหนดว่าตัวดำเนินการได้ควรทำก่อนหรือหลัง โดยมีข้อกำหนดดังนี้คือ ตัวดำเนินการที่มีความสำคัญมากกว่าจะดำเนินการก่อน ในกรณีที่มีตัวดำเนินการที่มีความสำคัญเท่ากันจะทำจากตัวดำเนินการทางซ้ายก่อนแล้วไปยังตัวดำเนินการทางขวา ลำดับความสำคัญของตัวดำเนินการเป็นดังตารางที่ 3.8
ตารางที่ 3.8 ลำดับความสำคัญของตัวดำเนินการ
จากตัวอย่างที่ 3.12 ผลลัพธ์ของโปรแกรมตัวแปร result จะมีค่าเท่ากับ 8 เนื่องจากเครื่องหมาย / มีความสำคัญมากกว่าเครื่องหมาย + จึงอธิบายลำดับการทำงานได้ดังนี้ result = 6 + (4 / 2) = 6 + 2 = 8
จากตัวอย่างที่ 3.13 อธิบายลำดับการคำนวณได้ดังนี้
\[ \begin{aligned} & \text { result1 }=-(-1)+(10 * 2)=1+20=21 \\ & \text { result2 }=-(-1)+(10 / 2)=1+5=6 \end{aligned} \]
จากตัวอย่างที่ 3.14 อธิบายลำดับการคำนวณจากคำสั่ง result1 = x * y++ ได้ดังนี้
ขั้นตอนที่ 1 result1 = x * y = 4 * 3 = 12
ขั้นตอนที่ 2 y = y + 1 = 3 + 1 = 4 (ตัวดำเนินการลดค่าทีละหนึ่งทำทีหลัง)
วงเล็บเป็นเครื่องหมายที่ช่วยในการกำหนดหรือควบคุมลำดับการทำงานของตัวดำเนินการ โดยต้องทำงานในวงเล็บก่อนเสมอ ดังตัวอย่างที่ 3.15
จากตัวอย่างที่ 3.15 อธิบายลำดับการคำนวณได้ดังนี้
\[ \begin{aligned} & \text { result1 }=6+(4 / 2)=8 \\ & \text { result2 }=(6+4) / 2=5 \end{aligned} \]
สำหรับการคำนวณทางคณิตศาสตร์ในภาษาจาวากำหนดลำดับความสำคัญจากมากไปน้อยหรือลำดับการทำงานก่อนหลัง ดังนี้
คำนวณในวงเล็บเป็นลำดับแรกสุด
เรียกใช้เมท็อดแล้วนำค่าผลลัพธ์ที่ได้มาใช้ในการคำนวณในขั้นต่อไป
ติดลบ
ทำการคูณหรือหาร (เรียงจากซ้ายไปขวา)
ทำการบวกหรือลบ (เรียงจากซ้ายไปขวา)
ทำการให้ค่าหรือกำหนดค่าด้วยเครื่องหมาย =
แบบฝึกหัด
ให้หาคำตอบจากคำสั่งต่อไปนี้ พร้อมทั้งแสดงวิธีทำ โดยกำหนดค่าตัวแปร ดังนี้ int A = 5, B =1 0 , C = 15;
1.1 int result1 = (A*B)+(C+B)/B;
1.2 int result2 = C+B/A*B;
1.3 int result3 = B-A+C/(A*C);
1.4 int result4 = ((A/2*C)+10)*(B/2);
1.5 int result5 = (C*10/A)+(A*C)%C;
ให้หาคำตอบจากคำสั่งต่อไปนี้ พร้อมทั้งแสดงวิธีทำ โดยกำหนดค่าตัวแปร ดังนี้ int a = 7, b = 3, int c = 2;
2.1 int result6 = -c % b + a / b;
2.2 int result7 = (++a * b) + c–;
2.3 boolean result8 = (c < 5) || (b < c+a) && (a == b);
2.4 boolean result9 = (a > b) || !(a <= c) && b > c / 2;
2.5 boolean result10 = a < b && !(a <= c) && b > c / 2;
2.6 boolean result11 = (a > b) && !(a <= c) || b > c / 2
ให้แสดงผลลัพธ์ที่พิมพ์ออกทางจอภาพจากส่วนของโปรแกรมต่อไปนี้ พร้อมทั้งอธิบายผลลัพธ์ที่ได้
- ให้เขียนโปรแกรมเพื่อรับค่าตัวเลขจำนวนเต็ม 2 จำนวน แล้วนำผลบวก ผลลบ ผลคูณ ผลหาร และการเปรียบเทียบว่าจำนวนที่ 1 มากกว่าจำนวนที่ 2 หรือไม่ แล้วแสดงผลทางจอภาพ โดยจัดรูปแบบหน้าจอดังนี้
ตัวอย่าง การทำงานของโปรแกรมเมื่อป้อนเลข 9 และ 2
- ให้เขียนโปรแกรมผ่อนชำระหนี้ (loan amortization) โดยรับข้อมูลจำนวนเงินกู้ (loan amount) จำนวนปี (number of years) และอัตราดอกเบี้ยต่อปี (annual interest rate) จากผู้ใช้มาคำนวณหาจำนวนเงินที่ต้องจ่ายต่อเดือน (monthly payment) และจำนวนเงินที่ต้องจ่ายทั้งหมด (total payment) แล้วแสดงผลลัพธ์ออกทางจอภาพ
จำนวนเงินที่จ่ายต่อเดือน (monthly payment) คำนวณได้จากสูตรต่อไปนี้
\[ \mathrm{x}=\mathrm{y} \div\left[\frac{1-\left(1+\frac{\mathrm{i}}{12}\right)^{-12^* \mathrm{n}}}{\left(\frac{\mathrm{i}}{12}\right)}\right] \]
โดยที่
x คือ จำนวนเงินที่จ่ายต่อเดือน (monthly payment)
y คือ จำนวนเงินกู้ (loan amount)
n คือ จำนวนปี (number of years)
i คือ อัตราดอกเบี้ยต่อปี (annual interest rate)
i/12 คือ อัตราดอกเบี้ยต่อเดือน (monthly interest rate)
ตัวอย่าง เช่น
กู้เงิน 10000 บาท อัตราดอกเบี้ยต่อปี 7% (0.07) จำนวนปี 1 ปี (ผ่อนชำระให้หมดภายใน 1 ปี)
\[ \begin{aligned} x & =10000 /[(1-(1+(0.07 / 12))-12 * 1) /(0.07 / 12)] \\ & =865.26 \end{aligned} \]
จำนวนเงินที่จ่ายต่อเดือน (monthly payment) หรือต้องผ่อนชำระต่อเดือนเป็นเงิน 865.26 บาท จำนวนเงินที่ต้องจ่ายทั้งหมด (total payment) = x * (n * 12) = 865.26 * (1 * 12) = 10383.21 ดังนั้นต้องจ่ายเงินทั้งหมดเป็นเงิน 10383.21 บาท
ตัวอย่าง ผลลัพธ์ของโปรแกรมเมื่อป้อนจำนวนเงินกู้ 10000 บาท จำนวนปี 1 ปี และอัตราดอกเบี้ยต่อปี 0.07 (7%)
คำแนะนำ การหาค่ายกกำลังในภาษาสามารถเรียกใช้เมท็อด pow ของคลาส Math ได้ เช่น การหาค่า 23 เขียนดังนี้ Math.pow(2, 3) จะให้ค่าคือ 8.0, การหาค่า 3.52.5 เขียนดังนี้ Math.pow(3.5, 2.5) จะให้ค่าคือ 22.91765 เป็นต้น