|
ตัวดำเนินการ
ในการเขียนโปรแกรมตวดำเนินการจะเป็นตัวทำหน้าที่รวมค่าต่างๆ และกระทำกับค่าต่างๆ ให้เป็นค่าเดียวกัน อย่างเช่นโปรแกรมในบทที่ผ่านมามีการนำข้อมูลที่เป็นตัวแปรมาคูณกับค่าคงที่ ซึ่งจะต้องใช้ตัวดำเนินการทางคณิตศาสตร์เพื่อทำการคูณ ตัวดำเนินการมีหลายประเภทดังต่อไปนี้
1. ตัวดำเนินการเลขคณิต
ใช้สำหรับกระทำการคำนวณทางคณิตศาสตร์ เช่น บวก ลบ คูณ หาร โดยจะนำข้อมูลตัวหนึ่งไปกระทำกับอีกตัวหนึ่ง โดยใช้ผลลัพธ์เป็นตัวเลขทางคณิตศาสตร์ ตัวดำเนินการทางคณิตศาสตร์ แบ่งออกได้ดังต่อไปนี้
ตารางที่ 3.4.1 ตารางแสดงตัวดำเนินการเลขคณิต
ตัวดำเนินการ
|
กระบวนการ
|
ข้อมูลที่ถูกกระทำ
|
ข้อมูลผลลัพธ์
|
+ |
บวก (Addition) |
จำนวนเต็ม,จำนวนจริง |
จำนวนเต็ม,จำนวนจริง |
- |
ลบ (Subtraction) |
จำนวนเต็ม,จำนวนจริง |
จำนวนเต็ม,จำนวนจริง |
* |
คูณ (Multiplication) |
จำนวนเต็ม,จำนวนจริง |
จำนวนเต็ม,จำนวนจริง |
/ |
หาร (Real Number Division) |
จำนวนเต็ม,จำนวนจริง |
จำนวนจริง |
% |
การหารแบบเอาเศษ (Modulus) |
จำนวนเต็ม |
จำนวนเต็ม |
ตัวอย่างที่ 3.4.1 โปรแกรมพิมพ์ผลลัพธ์จากการใช้ตัวดำเนินการคำนวณ 1 ตัว
|
|
|
#include <stdio.h> |
|
int main() { |
|
int a = 4, b, c, d; |
|
b = a + 5; |
|
c = a - 5; |
|
d = -c; |
|
printf("a, b, c and d is "); |
|
printf("%d, %d, %d and %d. \n", a, b, c, d); |
|
b = a * 5; |
|
c = a / 5; |
|
d = a % 5; |
|
printf("a, b, c and d is "); |
|
printf("%d, %d, %d and %d. \n", a, b, c, d); |
|
printf("7.0/2 is %f. \n", 7.0/2); |
|
printf("a/5.0 is %f. \n", a/5.0); |
|
printf("b/4.5 is %f. \n", b/4.5); |
|
getch(); |
|
} |
|
ผลลัพธ์ คือ
a, b, c, and d is 4, 9, -1, and 1.
a, b, c, and d is 4, 20, 0, and 4.
7.0/2 is 3.500000.
a/5.0 is 0.800000.
b/4.5 is 4.444444.
|
|
ตัวอย่างที่ 3.4.2 โปรแกรมพิมพ์ผลลัพธ์จากการใช้ตัวดำเนินการแปลงชนิดข้อมูล
|
|
|
#include <stdio.h> |
|
int main() { |
|
int num1, num2, num3, sum; |
|
float average; |
|
printf("Enter first integer: "); |
|
scanf("%d", &num1); |
|
printf("\nEnter second integer: "); |
|
scanf("%d", &num2); |
|
printf("\nEnter third integer: "); |
|
scanf("%d", &num3); |
|
sum = num1 + num2 + num3; |
|
average = (float) sum / 3; |
|
printf("\nAverage of the three number is "); |
|
printf("%6.4f. \n", average); |
|
getch(); |
|
} |
|
ผลลัพธ์ คือ
Enter first integer: 8
Enter second integer: 5
Enter third integer: 13
Average of the three numbers is 8.6667.
|
|
หมายเหตุ
- หมายถึง ให้กดปุ่ม Enter บนแป้นพิมพ์
จากตัวอย่าง 3.4.2 คำสั่ง sum / 3 ควรจะให้ผลลัพธ์เป็นจำนวนเต็ม 8 เนื่องจากตัวถูกดำเนินการทั้งสองตัวมีชนิดเป็นจำนวนเต็ม แต่ในที่นี้เราได้แปลงชนิดข้อมูลของตัวแปร sum แบบชั่วคราว จากจำนวนเต็มให้เป็นจำนวนจริง โดยใช้ (float) ทำให้ sum / 3 ในบรรทัดที่ 13 ให้ผลลัพธ์เป็นจำนวนจริงก่อนนำไปกำหนดให้เป็นค่าของตัวแปร average
2. ตัวดำเนินการเปรียบเทียบ
ตัวดำเนินการเปรียบเทียบ (Relation Operators) จะนำข้อมูลสองค่ามาเปรียบเทียบกัน โดยข้อมูลทั้งสองค่าจะต้องเป็นข้อมูลประเภทเดียวกัน ผลลัพธ์ที่ได้จะเป็นค่าทางลอจิก คือ จริงหรือเท็จ
ตารางที่ 3.4.2 ตารางแสดงตัวดำเนินการเปรียบเทียบ
ตัวดำเนินการ
|
การกระทำ
|
== |
เท่ากับ |
!= |
ไม่เท่ากับ |
<= |
น้อยกว่าหรือเท่ากับ |
>= |
มากกว่าหรือเท่ากับ |
> |
มากกว่า |
< |
น้อยกว่า |
ตัวอย่างที่ 3.4.3 โปรแกรมทดสอบการใช้ตัวดำเนินการเปรียบเทียบ
|
|
|
#include <stdio.h> |
|
int main() { |
|
printf("18 > 9 = %d\n", 18 > 9); |
|
printf("11 < -9 = %d\n", 11 < -9); |
|
|
|
int result1, result2; |
|
float a = 9.0, b = 9.01; |
|
result1 = a > b; |
|
result2 = a < b; |
|
|
|
printf("a = %0.2f, b = %0.2f\n", a,b); |
|
printf("result1 [a > b] = %d \n", result1); |
|
printf("result2 [a < b] = %d \n", result2); |
|
getch(); |
|
} |
|
ผลลัพธ์ คือ
18 > 9 = 1
11 < -9 = 0
a = 9.00, b = 9.01
result1 [a > b] = 0
result2 [a < b] = 1
|
|
3. ตัวดำเนินการทางตรรกะ
ตัวดำเนินการทางตรรกะ (Logical Operator) ประกอบด้วย การทำ AND(และ) , OR(หรือ) และ NOT(นิเสธ) เมื่อกระทำกับค่าใด ผลลัพธ์ที่ออกมาจะเป็นจริงหรือเท็จ ตัวดำเนินการทางตรรกะแสดงได้ ดังตารางต่อไปนี้
ตารางที่ 3.4.3 ตารางแสดงตัวดำเนินการทางตรรกะ
ตัวดำเนินการ
|
การกระทำ
|
&& |
ดำเนินการ AND ค่าสองค่า ถ้าค่าทั้งสองเป็นจริง ผลลัพธ์จะเป็นจริง |
|| |
ดำเนินการ OR ค่าสองค่า ถ้าค่าทั้งสองเป็นเท็จ ผลลัพธ์จะเป็นเท็จ |
! |
ดำเนินการ NOT เปลี่ยนค่า จากจริงเป็นเท็จ จากเท็จเป็นจริง |
จากตารางค่าความจริงของนิพจน์ตรรกะ เมื่อ 0 แทนค่าเท็จ และ 1 แทนค่าจริง แสดงดังตาราง
ตารางที่ 3.4.4 ตารางค่าความจริงของนิพจน์ตรรกะ
- p && q จะมีค่าจริง เมื่อ p และ q มีค่าจริงทั้งคู่ มิฉะนั้นจะมีค่าเป็นเท็จ
- p || q จะมีค่าจริง เมื่อ p และ q มีค่าเท็จทั้งคู่ มิฉะนั้นจะมีค่าเป็นจริง
- !p จะมีค่าจริง เมื่อ p มีค่าเท็จ และ !p จะมีค่าเท็จ เมื่อ p มีค่าจริง
ตัวอย่างที่ 3.4.4 โปรแกรมแสดงค่าของนิพจน์ตรรกะ
|
|
|
#include <stdio.h> |
|
int main() { |
|
int x, y; |
|
|
|
printf("Enter an value of x: "); |
|
scanf("%d", &x); |
|
printf("Enter an value of y: "); |
|
scanf("%d", &y); |
|
|
|
printf("\nExample of logical expressions\n"); |
|
printf("------------------------------\n"); |
|
printf(" x && y %d\n", x && y); |
|
printf(" x || y %d\n", x || y); |
|
printf(" !x %d\n", !x); |
|
printf(" !y %d\n", !y); |
|
printf("(x > 0) && (y > 0) %d\n", (x > 0) && (y > 0)); |
|
printf("(x > 0) || (y > 0) %d\n", (x > 0) || (y > 0)); |
|
printf("(x > y) || (y > x) %d\n", (x > y) || (y > x)); |
|
printf("(x > y) && (y > x) %d\n", (x > y) && (y > x)); |
|
getch(); |
|
} |
|
ผลลัพธ์ คือ
Enter an value of x: 6
Enter an value of y: -2
Example of logical expressions
------------------------------
x && y 1
x || y 1
!x 0
!y 0
(x > 0) && (y > 0) 0
(x > 0) || (y > 0) 1
(x > y) || (y > x) 1
(x > y) && (y > x) 0
|
|
หมายเหตุ
- หมายถึง ให้กดปุ่ม Enter บนแป้นพิมพ์
4. ตัวดำเนินการแบบบิต
จะนำข้อมูลสองค่ามาเปรียบเทียบกัน โดยข้อมูลทั้งสองค่าจะต้องเป็นข้อมูลประเภทเดียวกัน ผลลัพธ์ที่ได้จะเป็นค่าทางลอจิก คือ จริงหรือเท็จ
ตารางที่ 3.4.5 ตารางแสดงตัวดำเนินการแบบบิต
ตัวดำเนินการ
|
การกระทำ
|
& |
ดำเนินการ AND ให้ค่าของบิตผลลัพธ์เป็น 1 ถ้าบิตที่นำมาดำเนินการ And กันเป็น 1 ทั้งคู่ กรณีอื่น ๆ จะให้ค่าของบิตผลลัพธ์เป็น 0 |
| |
ดำเนินการ OR ให้ค่าของบิตผลลัพธ์เป็น 0 ถ้าหากบิตที่นำมาดำเนินการ or กันเป็น 0 ทั้งคู่ กรณีอื่น จะให้ค่าของบิตผลลัพธ์เป็น 1 |
^ |
ดำเนินการ Exclusive OR (XOR) การกำหนดค่าให้ตัวแปรทางซ้ายมือลดค่าลงเท่ากับค่า (expression) หรือตัวแปรทางขวามือ |
~ |
ดำเนินการ NOT กลับค่าบิตจาก 0 เป็น 1 และจาก 1 เป็น 0 (1's complement) |
>> |
ดำเนินการ Shift right เลื่อนทุกบิตไปทางขวา |
<< |
ดำเนินการ Shift left เลื่อนทุกบิตไปทางซ้าย |
5. ตัวดำเนินการกำหนดค่าเชิงประกอบ
การใช้ตัวดำเนินการบางประเภทสามารถนำมารวมกันเป็น ตัวดำเนินการกำหนดค่าเชิงประกอบ (Compound Assisgnment) ได้ มีรูปแบบคือ
มีความหมายเทียบเท่ากับ
เมื่อ op เป็นตัวดำเนินการคำนวณใดๆ ดังตัวอย่างต่อไปนี้
ตารางที่ 3.4.6 ตารางแสดงตัวอย่างการใช้ตัวดำเนินการกำหนดค่าเชิงประกอบ
ตัวดำเนินการ
|
ตัวอย่าง
|
การประมวลผล
|
*= |
a *= 1.25 |
a = a * 1.25 |
/= |
b /= c |
b = b / c |
%= |
d %= 3 |
d = d % 3 |
+= |
x += 1 |
x = x + 1 |
-= |
y -= z |
y = y - z |
ตัวอย่างที่ 3.4.5 โปรแกรมแสดงการใช้ตัวดำเนินการกำหนดค่าเชิงประกอบ
|
|
|
#include <stdio.h> |
|
int main() { |
|
int a = 0, b = 5; |
|
|
|
a += 4; |
|
printf("a is %d.\n",a); |
|
a *= 3; |
|
printf("a is %d.\n",a); |
|
a /= 4; |
|
printf("a is %d.\n",a); |
|
a %= 5; |
|
printf("a is %d.\n",a); |
|
a = 7; |
|
a /= a - b; |
|
printf("a is %d.\n",a); |
|
b *= b + a; |
|
printf("b is %d.\n",b); |
|
getch(); |
|
} |
|
ผลลัพธ์ คือ
a is 4.
a is 12.
a is 3.
a is 3.
a is 3.
a is 40.
|
|
จากโปรแกรม สามารถอธิบายได้ ดังนี้
บรรทัดที่ |
คำสั่ง |
ลักษณะการทำงาน |
6 |
a += 4 |
a = a + 4 |
8 |
a *= 3 |
a = a * 3 |
10 |
a /= 4 |
a = a / 4 |
12 |
a %= 5 |
a = a % 5 |
15 |
a /= a - b |
a = a / (a - b) |
17 |
b *= b + a |
b = b * (b + a) |
6. ตัวดำเนินการเพิ่มค่าและลดค่า
ตัวดำเนินการเพิ่มค่า (Increment Operator) ใช้เครื่องหมาย ++
ตัวดำเนินการลดค่า (Decrement Operator) ใช้เครื่องหมาย --
โดยการเพิ่มค่า หรือการลดค่าด้วยตัวดำเนินการดังกล่าว จะเพิ่มทีละหนึ่ง หรือลดทีละหนึ่ง และจะต้องใช้กับตัวแปรโดดๆ โดยสามารถใช้เครื่องหมาย ++ และ -- เขียนนำหน้าตัวแปร (Prefix) หรือหลังตัวแปร (Postfix) ก็ได้ เช่น ++i หรือ i++ แต่ทั้งสองแบบนี้จะมีวิธีการจัดการกับค่าที่แตกต่างกัน ดังตาราง
ตารางที่ 3.4.7 ตารางแสดงตัวดำเนินการเพิ่มค่าและลดค่า
ตัวดำเนินการ
|
นิพจน์
|
ความหมาย
|
++ (Prefix) |
++a |
เพิ่มค่าให้กับ a หนึ่งค่าก่อน จึงนำค่าใหม่ของ a ในนิพจน์นี้ไปใช้ |
++ (Postfix) |
a++ |
นำค่าปัจจุบันของ a ในนิพจน์นี้ไปใช้ก่อน จึงเพิ่มค่าให้กับ a หนึ่งค่า |
-- (Prefix) |
--b |
ลดค่าให้กับ b หนึ่งค่าก่อน จึงนำค่าใหม่ของ b ในนิพจน์นี้ไปใช้ |
-- (Postfix) |
b-- |
นำค่าปัจจุบันของ b ในนิพจน์นี้ไปใช้ก่อน จึงลดค่าให้กับ b หนึ่งค่า |
หมายเหตุ
- ++i ,i++ หมายถึง i = i + 1
- --j ,j-- หมายถึง j = j - 1
ตัวอย่างที่ 3.4.6 โปรแกรมแสดงการเพิ่มและลดค่าตัวแปร
|
|
|
#include <stdio.h> |
|
int main() { |
|
int x = 8; |
|
|
|
printf("x is %d.\n" ,x); |
|
printf("x++ is %d.\n" ,x++); |
|
printf("x is %d.\n" ,x); |
|
|
|
x = 4; |
|
printf("x is %d.\n" ,x); |
|
printf("--x is %d.\n" ,--x); |
|
printf("x is %d.\n" ,x); |
|
getch(); |
|
} |
|
ผลลัพธ์ คือ
x is 8.
x++ is 8.
x is 9.
x is 4.
--x is 3.
x is 3.
|
|
นิพจน์
นิพจน์ (Expression) ในภาษาซีนี้ ประกอบด้วย ค่าคงตัว ค่าคงที่ หรือตัวแปร 1 จำนวน หรือกลุ่มของค่าคงตัว ค่าคงที่ หรือตัวแปรพร้อมด้วยตัวดำเนินการของภาษาซี ตัวดำเนินการที่ใช้ในนิพจน์ที่กล่าวถึงได้แก่ ตัวดำเนินการกำหนดค่า ตัวดำเนินการคำนวณ และตัวดำเนินการบอกตำแหน่งบนหน่วยความจำ
ans = 100 - 50
score = midterm + final +quiz
income = salary + (ot * RATE) + bonus - tax
|
จากนิพจน์คณิตศาสตร์ข้างต้น พบว่า ans, score และ income เป็นตัวแปรที่ใช้เก็บผลลัพธ์จากการคำนวณ ส่วนนิพจน์ด้านขวาจะเป็นนิพจน์แบบหลายตัวแปร ซึ่งสามารถมีได้ทั้งตัวแปร และค่าคงที่ รวมถึงตัวดำเนินการคณิตศาสตร์ เช่น + - * / เป็นต้น ซึ่งในการสร้างสูตรคำนวณค่าตัวเลข ซึ่งเป็นสูตรที่มีความซับซ้อน จะต้องระมัดระวังในการจัดลำดับนิพจน์ เพื่อให้คอมพิวเตอร์ประมวลผลได้อย่างถูกต้อง ทั้งนี้ตัวดำเนินการต่างๆ ที่นำมาใช้เพื่อการคำนวณนั้น แต่ละตัวจะมีลำดับความสำคัญที่แตกต่างกัน เช่น เมื่อพบเครื่องหมาย + และ * การประมวลผลจะกระทำที่ตัวดำเนินการ * ก่อน เพราะจะมีลำดับความสำคัญสูงกว่า + นั่นเอง
ตัวดำเนินการกับลำดับความสำคัญ
ตัวดำเนินการแต่ละตัวจะมีลำดับความสำคัญก่อนหลังที่แตกต่างกัน โดยการประมวลผลจะกระทำกับตัวดำเนินการที่มีลำดับควาสำคัญสูงก่อน แต่ถ้ากรณีที่มีลำดับความสำคัญเท่ากัน ตามปกติจะกระทำกับตัวดำเนินการจากซ้ายไปขวา
ตารางที่ 3.4.7 ตารางแสดงตัวดำเนินการกับลำดับความสำคัญ
ลำดับความสำคัญ
|
ตัวดำเนินการ
|
ความหมาย
|
1 |
() |
เครื่องหมายวงเล็บ |
2 |
++, -- |
ตัวดำเนินการเพิ่มค่า/ลดค่า |
3 |
-, ! |
ยูนารีลบ (เอกภาคลบ) และตรรกะ NOT |
4 |
*, /, % |
คูณ หาร โมดูลัส |
5 |
+, - |
บวก ลบ |
ตัวอย่างที่ 3.4.7 โปรแกรมพิมพ์ผลลัพธ์จากการใช้ตัวดำเนินการคำนวณมากกว่า 1 ตัว
|
|
|
#include <stdio.h> |
|
int main() { |
|
int a = 1, b = 2, c = 3,d,e; |
|
|
|
d = a * -b + c; |
|
e = a * (-b + c); |
|
printf("d is %d, e is %d. \n", d, e); |
|
|
|
d = a + b * c; |
|
e = (a + b) * c; |
|
printf("d is %d, e is %d. \n", d, e); |
|
|
|
d = b % c + a; |
|
e = b % (c + a); |
|
printf("d is %d, e is %d. \n", d, e); |
|
|
|
d = c - b / a * a; |
|
e = (c - b) / (a * a); |
|
printf("d is %d, e is %d. \n", d, e); |
|
|
|
printf("8 + 2 * 6 / 3 - 2 is %d. \n", 8 + 2 * 6 / 3 - 2); |
|
printf("5 % 5 + 5 * 5 - 5 / 5 is %d. \n", 5 % 5 + 5 * 5 - 5 / 5); |
|
getch(); |
|
} |
|
ผลลัพธ์ คือ
d is 1, e is 1.
d is 7, e is 9.
d is 3, e is 2.
d is 1, e is 1.
8 + 2 * 6 / 3 - 2 is 10
5 % 5 + 5 * 5 - 5 / 5 is 24
|
|
จากตัวอย่าง 3.4.6 เมื่อพิจารณาจากลำดับความสำคัญของตัวดำเนินการ จะพบว่า
ในบรรทัดที่ 18 นิพจน์ c - b / a * a มีค่าเท่ากับ c - ((b / a) * a) ซึ่งมีค่าเท่ากับ 1 และมีค่าเท่ากับค่าของนิพจน์ (c - b) / (a * a) ในบรรทัดที่ 19
จากบรรทัดที่ 22 ค่าของนิพจน์ 8 + 2 * 6 / 3 - 2 มีค่าเท่ากับนิพจน์ (8 + ((2 * 6) / 3) - 2
และบรรทัดที่ 23 ค่าของนิพจน์ 5 % 5 + 5 * 5 - 5 / 5 มีค่าเท่ากับนิพจน์ ((5 % 5) + (5 * 5)) - (5 / 5)
|
|