บทเรียน 6.1 ชนิดข้อมูลคืออะไร ?
บทเรียน 6.2 ลงมือปฏิบัติเกี่ยวกับชนิดข้อมูล
สำหรับในตอนนี้ จะมีวีดีโอทั้งหมด 2 ชุด โดยแนะนำว่าให้ทุกคน ควรที่จะตอบคำถามระหว่างวีดีโอในช่อง Comment ด้วยนะครับ ^_^
เสร็จสิ้น และดำเนินการต่อ🐣 หากมีคำถามระหว่างเรียนสามารถสอบถามได้เลยที่ 💬 borntoDev Discord Community
Discussion
161 ความคิดเห็น
Load more
- ตัวดำเนินการ
- นิพจน์
- ตัวดำเนินการกับลำดับความสำคัญ
ตัวดำเนินการ
ในการเขียนโปรแกรมตวดำเนินการจะเป็นตัวทำหน้าที่รวมค่าต่างๆ และกระทำกับค่าต่างๆ ให้เป็นค่าเดียวกัน อย่างเช่นโปรแกรมในบทที่ผ่านมามีการนำข้อมูลที่เป็นตัวแปรมาคูณกับค่าคงที่ ซึ่งจะต้องใช้ตัวดำเนินการทางคณิตศาสตร์เพื่อทำการคูณ ตัวดำเนินการมีหลายประเภทดังต่อไปนี้
- ตัวดำเนินการเลขคณิต
- ตัวดำเนินการเปรียบเทียบ
- ตัวดำเนินการทางตรรกะ
- ตัวดำเนินการแบบบิต
- ตัวดำเนินการกำหนดค่าเชิงประกอบ
- ตัวดำเนินการเพิ่มค่าและลดค่า
1. ตัวดำเนินการเลขคณิต
ใช้สำหรับกระทำการคำนวณทางคณิตศาสตร์ เช่น บวก ลบ คูณ หาร โดยจะนำข้อมูลตัวหนึ่งไปกระทำกับอีกตัวหนึ่ง โดยใช้ผลลัพธ์เป็นตัวเลขทางคณิตศาสตร์ ตัวดำเนินการทางคณิตศาสตร์ แบ่งออกได้ดังต่อไปนี้
ตารางที่ 3.4.1 ตารางแสดงตัวดำเนินการเลขคณิต
ตัวดำเนินการ | กระบวนการ | ข้อมูลที่ถูกกระทำ | ข้อมูลผลลัพธ์ |
+ | บวก (Addition) | จำนวนเต็ม,จำนวนจริง | จำนวนเต็ม,จำนวนจริง |
- | ลบ (Subtraction) | จำนวนเต็ม,จำนวนจริง | จำนวนเต็ม,จำนวนจริง |
* | คูณ (Multiplication) | จำนวนเต็ม,จำนวนจริง | จำนวนเต็ม,จำนวนจริง |
/ | หาร (Real Number Division) | จำนวนเต็ม,จำนวนจริง | จำนวนจริง |
% | การหารแบบเอาเศษ (Modulus) | จำนวนเต็ม | จำนวนเต็ม |
ตัวอย่างที่ 3.4.1 โปรแกรมพิมพ์ผลลัพธ์จากการใช้ตัวดำเนินการคำนวณ 1 ตัว
1 | //Program: SignOp.c |
2 | #include <stdio.h> |
3 | int main() { |
4 | int a = 4, b, c, d; |
5 | b = a + 5; |
6 | c = a - 5; |
7 | d = -c; |
8 | printf("a, b, c and d is "); |
9 | printf("%d, %d, %d and %d. \n", a, b, c, d); |
10 | b = a * 5; |
11 | c = a / 5; |
12 | d = a % 5; |
13 | printf("a, b, c and d is "); |
14 | printf("%d, %d, %d and %d. \n", a, b, c, d); |
15 | printf("7.0/2 is %f. \n", 7.0/2); |
16 | printf("a/5.0 is %f. \n", a/5.0); |
17 | printf("b/4.5 is %f. \n", b/4.5); |
18 | getch(); |
19 | } |
ผลลัพธ์ คือ
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 โปรแกรมพิมพ์ผลลัพธ์จากการใช้ตัวดำเนินการแปลงชนิดข้อมูล
1 | //Program: Cast.c |
2 | #include <stdio.h> |
3 | int main() { |
4 | int num1, num2, num3, sum; |
5 | float average; |
6 | printf("Enter first integer: "); |
7 | scanf("%d", &num1); |
8 | printf("\nEnter second integer: "); |
9 | scanf("%d", &num2); |
10 | printf("\nEnter third integer: "); |
11 | scanf("%d", &num3); |
12 | sum = num1 + num2 + num3; |
13 | average = (float) sum / 3; |
14 | printf("\nAverage of the three number is "); |
15 | printf("%6.4f. \n", average); |
16 | getch(); |
17 | } |
ผลลัพธ์ คือ
- หมายเหตุ
- หมายถึง ให้กดปุ่ม Enter บนแป้นพิมพ์
จากตัวอย่าง 3.4.2 คำสั่ง sum / 3 ควรจะให้ผลลัพธ์เป็นจำนวนเต็ม 8 เนื่องจากตัวถูกดำเนินการทั้งสองตัวมีชนิดเป็นจำนวนเต็ม แต่ในที่นี้เราได้แปลงชนิดข้อมูลของตัวแปร sum แบบชั่วคราว จากจำนวนเต็มให้เป็นจำนวนจริง โดยใช้ (float) ทำให้ sum / 3 ในบรรทัดที่ 13 ให้ผลลัพธ์เป็นจำนวนจริงก่อนนำไปกำหนดให้เป็นค่าของตัวแปร average
2. ตัวดำเนินการเปรียบเทียบ
ตัวดำเนินการเปรียบเทียบ (Relation Operators) จะนำข้อมูลสองค่ามาเปรียบเทียบกัน โดยข้อมูลทั้งสองค่าจะต้องเป็นข้อมูลประเภทเดียวกัน ผลลัพธ์ที่ได้จะเป็นค่าทางลอจิก คือ จริงหรือเท็จ
ตารางที่ 3.4.2 ตารางแสดงตัวดำเนินการเปรียบเทียบ
ตัวดำเนินการ | การกระทำ |
== | เท่ากับ |
!= | ไม่เท่ากับ |
<= | น้อยกว่าหรือเท่ากับ |
>= | มากกว่าหรือเท่ากับ |
> | มากกว่า |
< | น้อยกว่า |
ตัวอย่างที่ 3.4.3 โปรแกรมทดสอบการใช้ตัวดำเนินการเปรียบเทียบ
1 | //Program: TrueFalse.c |
2 | #include <stdio.h> |
3 | int main() { |
4 | printf("18 > 9 = %d\n", 18 > 9); |
5 | printf("11 < -9 = %d\n", 11 < -9); |
6 | |
7 | int result1, result2; |
8 | float a = 9.0, b = 9.01; |
9 | result1 = a > b; |
10 | result2 = a < b; |
11 | |
12 | printf("a = %0.2f, b = %0.2f\n", a,b); |
13 | printf("result1 [a > b] = %d \n", result1); |
14 | printf("result2 [a < b] = %d \n", result2); |
15 | getch(); |
16 | } |
ผลลัพธ์ คือ
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 โปรแกรมแสดงค่าของนิพจน์ตรรกะ
1 | //Program: Logic.c |
2 | #include <stdio.h> |
3 | int main() { |
4 | int x, y; |
5 | |
6 | printf("Enter an value of x: "); |
7 | scanf("%d", &x); |
8 | printf("Enter an value of y: "); |
9 | scanf("%d", &y); |
10 | |
11 | printf("\nExample of logical expressions\n"); |
12 | printf("------------------------------\n"); |
13 | printf(" x && y %d\n", x && y); |
14 | printf(" x || y %d\n", x || y); |
15 | printf(" !x %d\n", !x); |
16 | printf(" !y %d\n", !y); |
17 | printf("(x > 0) && (y > 0) %d\n", (x > 0) && (y > 0)); |
18 | printf("(x > 0) || (y > 0) %d\n", (x > 0) || (y > 0)); |
19 | printf("(x > y) || (y > x) %d\n", (x > y) || (y > x)); |
20 | printf("(x > y) && (y > x) %d\n", (x > y) && (y > x)); |
21 | getch(); |
22 | } |
ผลลัพธ์ คือ
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 โปรแกรมแสดงการใช้ตัวดำเนินการกำหนดค่าเชิงประกอบ
1 | //Program: ComAssi.c |
2 | #include <stdio.h> |
3 | int main() { |
4 | int a = 0, b = 5; |
5 | |
6 | a += 4; |
7 | printf("a is %d.\n",a); |
8 | a *= 3; |
9 | printf("a is %d.\n",a); |
10 | a /= 4; |
11 | printf("a is %d.\n",a); |
12 | a %= 5; |
13 | printf("a is %d.\n",a); |
14 | a = 7; |
15 | a /= a - b; |
16 | printf("a is %d.\n",a); |
17 | b *= b + a; |
18 | printf("b is %d.\n",b); |
19 | getch(); |
20 | } |
ผลลัพธ์ คือ
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 โปรแกรมแสดงการเพิ่มและลดค่าตัวแปร
1 | //Program: IncDec.c |
2 | #include <stdio.h> |
3 | int main() { |
4 | int x = 8; |
5 | |
6 | printf("x is %d.\n" ,x); |
7 | printf("x++ is %d.\n" ,x++); |
8 | printf("x is %d.\n" ,x); |
9 | |
10 | x = 4; |
11 | printf("x is %d.\n" ,x); |
12 | printf("--x is %d.\n" ,--x); |
13 | printf("x is %d.\n" ,x); |
14 | getch(); |
15 | } |
ผลลัพธ์ คือ
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 ตัว
1 | //Program: MultOp.c |
2 | #include <stdio.h> |
3 | int main() { |
4 | int a = 1, b = 2, c = 3,d,e; |
5 | |
6 | d = a * -b + c; |
7 | e = a * (-b + c); |
8 | printf("d is %d, e is %d. \n", d, e); |
9 | |
10 | d = a + b * c; |
11 | e = (a + b) * c; |
12 | printf("d is %d, e is %d. \n", d, e); |
13 | |
14 | d = b % c + a; |
15 | e = b % (c + a); |
16 | printf("d is %d, e is %d. \n", d, e); |
17 | |
18 | d = c - b / a * a; |
19 | e = (c - b) / (a * a); |
20 | printf("d is %d, e is %d. \n", d, e); |
21 | |
22 | printf("8 + 2 * 6 / 3 - 2 is %d. \n", 8 + 2 * 6 / 3 - 2); |
23 | printf("5 % 5 + 5 * 5 - 5 / 5 is %d. \n", 5 % 5 + 5 * 5 - 5 / 5); |
24 | getch(); |
25 | } |
ผลลัพธ์ คือ
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)