ݺߣ

ݺߣShare a Scribd company logo
บทที่ 3
ตัวดาเนินการ (Operators)
ฅัวดาเนินการคานวณพื้นฐานมีดังนี้
+ ตัวดาเนินการ บวก
- ตัวดาเนินการ ลบ
* ตัวดาเนินการ คูณ
/ ตัวดาเนินการ หาร
% ตัวดาเนินการมอดูลัส(Modulus) หรือหารแล้วเอาเฉพาะเศษนั่นเอง
เราสามารถใช้ตัวดาเนินการคานวณเหล่านี้ทาการคานวณแล้วเก็บค่าไว้ในตัวแปรหรือแสดงผลลัพธ์ออกมาเลย
ก็ได้ ดังตัวอย่างต่อไปนี้
int x = 7, y = 3;
int sum, mod, div;
sum = x + y;
mod = x % y;
div = x / y;
printf("sum = %dn", sum);
printf("x + y = %dn", x + y);
printf("mod = %dn", mod);
printf("div = %dn", div);
printf("%d + %d + %d = %d", sum, mod, div, sum + mod + div);
sum = 10
x + y = 10
mod = 1
div = 2
10 + 1 + 2 = 13
โค้ด
ผลลัพธ์
เอกสารประกอบการสอน ภาษาซี
โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี
หน้า 26
ถ้าสังเกตดีๆ จะเห็นว่า div หรือ x / y มีค่าเป็น 2 ไม่ใช่ 2.333 ทั้งนี้เพราะว่า
int ทาอะไรกับ int ก็ต้องได้ int
7 / 3 = 2
(โดยคอมพิวเตอร์จะแปลง 2.333 ให้เป็น int ด้วยการปัดทศนิยมทิ้ง)
ในทานองเดียวกัน
double ทาอะไรกับ double ก็ย่อมได้ double
ข้อมูลจาพวกตัวเลขประเภทอื่นก็เช่นเดียวกัน
แล้วถ้า เลขสองตัวนั้น เป็นคนละประเภทล่ะ จะเป็นอย่างไร?
int ทาอะไรกับ double ก็ต้องได้ double
* อันนี้ต้องจา ระวังคานวณพลาดเพราะจุดนี้
แล้วถ้าอยากให้ 7 / 3 มีค่าเท่ากับ 2.333 ล่ะจะทาอย่างไร
เราก็ต้องแปลง 7 กับ3 ตัวใดตัวหนึ่งหรือทั้งสองตัวให้เป็น double ก่อน
มี 2 วิธี ดังนี้
7.0 + 3.0 หรือ (double) 7 + (double) 3
วิธีแรกคือการเติม .0 ให้กับเลขจานวณเต็มเลขนั้นก็จะกลายเป็นเลขที่มีทศนิยมเป็น0 ซึ่งเป็นdouble ทันที
ส่วนอีกวิธีหนึ่งคือการใส่(double) ไว้ด้านหน้าตัวเลขที่เราต้องการจะแปลงเลขตัวนั้นก็จะถูกเปลี่ยนให้เป็น
double ทันที ในทานองเดียวกัน(int),(long),(float) ก็ทาได้เช่นกัน
แต่ว่าวิธีแรกนั้น จะไม่สามารถใช้กับตัวแปรได้ต้องใช้วิธีหลังคือการเติม (double) เท่านั้นดังนี้
(double) x + (double) y
โดยจะทาการแปลงค่าที่ถูกเรียกใช้มาจากตัวแปร x และ y เป็น double
แต่ค่าที่เก็บไว้ใน x และ y ยังคงเป็น int เหมือนเดิม ไม่ถูกเปลี่ยนแปลง
เอกสารประกอบการสอน ภาษาซี
โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี
หน้า 27
ทีนี้เราลองมาเขียนโค้ดกันดู
อ้าว ไหนเราอุตส่าห์แปลงค่าจากตัวแปรให้เป็นdouble แล้วไง ทาไมยังได้ 2 อยู่ล่ะ
ที่เป็นอย่างนี้ เพราะว่า div นั้นเป็นตัวแปรประเภท int นั่นเอง สิ่งที่จะเก็บเข้าตัวแปรประเภท int จะถูกแปลง
ให้เป็น int โดยอัตโนมัติ
ดังนั้นเราต้องประกาศ div ให้เป็นตัวแปรประเภท double ด้วย
และอย่าลืมที่เปลี่ยน %d เป็น %lf ด้วย เดี๋ยวจะผิดซ้าสอง
ผลลัพธ์ result = 2.333333 ก็เป็นอันที่เรียบร้อย
int x = 7, y = 3;
int div = (double) x / (double) y;
printf("result = %d", div);
โค้ด
ผลลัพธ์
result = 2
int x = 7, y = 3;
double div = (double) x / (double) y;
printf("result = %lf", div);
โค้ด
เอกสารประกอบการสอน ภาษาซี
โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี
หน้า 28
Operator Precedence
คือ ลาดับการทางานของตัวดาเนินการคานวณ
3 + 4 * 2 บางคนอาจสงสัยว่า ทาไมไม่เท่ากับ14 !!
นั่นเป็นเพราะว่าคอมพิวเตอร์จะทาการคูณและหาร ก่อนบวกลบเสมอ
เช่น 3 + 4 * 2 คอมพิวเตอร์จะทา4 * 2 ก่อน มีค่าเท่ากับ 8 แล้วค่อยทา 3 + 8 จึงได้ 11 นั่นเอง
ถ้าอยากให้คอมพิวเตอร์ ทาการบวกก่อนการคูณ ให้ใส่เครื่องหมายวงเล็บ ( ) ครอบไว้ ดังนี้
คอมพิวเตอร์จะทาการประมวลผลเรียงลาดับดังนี้
1. ( ) คอมพิวเตอร์จะทาการคานวณในวงเล็บก่อนเสมอ
2. * / % จากนั้นจะทาการคูณ หาร มอดูลัส เรียงจากซ้ายไปขวา เจอเครื่องหมายใดก่อนทาก่อน
3. + - และทาการบวก ลบ เรียงจากซ้ายไปขวาเช่นกัน
ลองมาดูอีกซักตัวอย่าง
เห็นเยอะๆ อย่าเพิ่งตกใจไป ก่อนอื่นขั้นแรกให้หยิบวงเล็บมาทาก่อนเลย
1 + 5 % ( 8 - 4 / 2 * 3 ) * 4
ในวงเล็บให้ทาเครื่องหมาย * / % เจอเครื่องหมายใดก่อน ทาก่อนจากซ้ายไปขวา
ในที่นี้เราเจอ - ก่อนอับดับแรก จะยังไม่ทาข้ามไปก่อน จากนั้นเจอ /ทาเลย 4 / 2 = 2 แทนค่ากลับไปได้
1 + 5 % ( 8 - 2 * 3) * 4
int x = 3 + 4 * 2;
printf("%d", x);
โค้ด
11
ผลลัพธ์
int x = ( 3 + 4 ) * 2;
printf("%d", x);
โค้ด
14
ผลลัพธ์
int x = 1 + 5 % ( 8 - 4 / 2 * 3 ) * 4;
printf("%d", x);
โค้ด
5
ผลลัพธ์
เอกสารประกอบการสอน ภาษาซี
โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี
หน้า 29
จากนั้นเจอ *ทาเลย 2 * 3 = 6 แทนค่ากลับไปได้
1 + 5 % ( 8 - 6) * 4
ตอนนี้ยังอยู่ในวงเล็บอยู่ เสร็จจากการทา * / % แล้ว ค่อยมาทา + -
ก็จะได้8 - 6 = 2 แทนค่ากลับไปได้
1 + 5 % 2 * 4 ในวงเล็บเหลือค่าเดียวแล้ว ถอดวงเล็บออกได้
เมื่อเสร็จจากการทาในวงเล็บแล้วต่อไปก็คือทา * / %
ไล่จากซ้ายไปขวา เจอ + ยังไม่ทาเก็บไว้ก่อน เจอ % ทาเลย 5 % 2 = 1แทนค่ากลับไปได้
1 + 1 * 4
จากนั้นทา * ก่อนได้1 * 4 = 4 แทนค่ากลับไปได้
1 + 4
สุดท้ายจึงทาการบวกได้1 + 4 = 5
5
เป็นอันเสร็จสิ้น
คาสั่งกาหนดค่าเชิงประกอบ
คาสั่งกาหนดค่าเชิงประกอบ ( compound assignment) มีรูปแบบคือ
c op= d;
ซึ่งมีความหมายเทียบเท่ากับ c = c op d;
เมื่อ op เป็นตัวดาเนินการคานวณใด ๆ( + - * / % )
โค้ด หมายถึง มีความหมายเหมือนกับ
n++; เพิ่มค่า n ขึ้นอีก1 n = n + 1;
n--; ลดค่า n ลงไป 1 n = n - 1;
n+=5; เพิ่มค่า n เข้าไป5 n = n + 5;
n-=13 ลดค่า n ลงมา 13 n = n – 13;
n*=2 นา n มาคูณด้วย 2 n = n*2;
n/=2 นา n มาหารด้วย 2 n = n/2;
เอกสารประกอบการสอน ภาษาซี
โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี
หน้า 30
ตัวอย่าง 3.1 โปรแกรมแสดงการใช้คาสั่งกาหนดค่าเชิงประกอบ
/* 1 */ //Program : CompAssi.c
/* 2 */ //แสดงการใช้คาสั่งกาหนดค่าเชิงประกอบ
/* 3 */
/* 4 */ #include <stdio.h>
/* 5 */ #include <conio.h>
/* 6 */ int main(){
/* 7 */ int a = 0, b = 5;
/* 8 */
/* 9 */ a += 4;
/*10 */ printf(“a is %d.n”,a);
/*11 */ a *= 3;
/*12 */ printf(“a is %d.n”,a);
/*13 */ a /= 4;
/*14 */ printf(“a is %d.n”,a);
/*15 */ a %= 5;
/*16 */ printf(“a is %d.n”,a);
/*17 */ a = 7;
/*18 */ a /= a - b;
/*19 */ printf(“a is %d.n”,a);
/*20 */ b *= b + a;
/*21 */ printf(“b is %d.n”,b);
/*22 */ getch();
/*23 */ return 0;
/*24 */ }
คาสั่งเพิ่มและลดค่า
นอกจากการใช้คาสั่งกาหนดค่าเชิงประกอบแล้ว ภาษาซียังมีรูปแบบการเขียนคาสั่งเพื่อเพิ่มหรือลดค่า
ตัวแปรชนิดจานวนเต็มทีละ1 ในแบบย่อ โดยอาศัยตัวดาเนินการเอกภาคเพิ่มค่า ++ และตัวดาเนินการเอก
ภาคลดค่า -- ดังตัวอย่างต่อไปนี้
รูปที่3.1 ตัวดาเนินการเอกภาคเพิ่มค่า รูปที่ 3.2 ตัวดาเนินการเอกภาคลดค่า
แต่ละคาสั่งด้านบนจะมีผลให้ x ในรูปที่3.1 มีค่าเพิ่มขึ้นทีละ 1 และ y ในรูปที่3.2 มีค่าลดลงทีละ 1
ดังนั้นหลังจากประมวลผลคาสั่งข้างต้นแล้ว x และ y จะมีค่าเป็น7 และ 5 ตามลาดับ
ผลลัพธ์
……………………………………..
……………………………………..
…………………………………….
……………………………………..
……………………………………..
……………………………………..
……………………………………..
int x = 4;
x = x + 1;
x += 1;
x++;
int y = 8;
y = y - 1;
y -= 1;
--y;
เอกสารประกอบการสอน ภาษาซี
โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี
หน้า 31
ตัวดาเนินการ ++ และตัวดาเนินการ -- อาจวางอยู่ด้านหลังหรือด้านหน้าตัวแปร ดังเช่น x++ หรือ ++x
เป็นต้น เมื่อวางตัวดาเนินการเอกภาคเพิ่มค่า (หรือเอกภาคลดค่า) ไว้ด้านหลังตัวแปร จะมีผลให้การเพิ่ม (หรือ
ลด) ค่าตัวแปรอีก 1 เกิดขึ้นหลังจากการอ้างอิงค่าตัวแปรดังกล่าวในคาสั่งเดียวกัน และเมื่อวางตัวดาเนินการเอก
ภาคเพิ่มค่า (หรือเอกภาคลดค่า) ไว้ด้านหน้าตัวแปร จะมีผลให้การเพิ่ม (หรือลด) ค่าตัวแปรอีก1 เกิดขึ้นก่อน
จากการอ้างอิงค่าตัวแปรดังกล่าวในคาสั่งเดียวกัน เช่น
รูปที่ 3.3 เพิ่มค่าหลังการอ้างอิง รูปที่ 3.4 เพิ่มค่าก่อนการอ้างอิง
คาสั่งในรูปที่ 3.3 จะมีผลให้ตัวแปรb มีค่าเท่ากับ 40 และ คาสั่งในรูปที่ 3.4 จะมีผลให้ตัวแปรc มี
ค่าเท่ากับ 42 ในขณะที่ตัวแปรa ทั้งสองกรณีมีค่าเป็น 21
ตัวอย่าง 3.2 โปรแกรมแสดงการเพิ่มค่าและลดค่าตัวแปรในแบบย่อ
/* 1 */ //Program : IncDec1.c
/* 2 */ // เพิ่มและลดค่าตัวแปรในแบบย่อ
/* 3 */
/* 4 */ #include <stdio.h>
/* 5 */ #include <conio.h>
/* 6 */ int main(){
/* 7 */ int x = 8;
/* 8 */
/* 9 */ printf(“x is %d.n”,x);
/*10 */ printf(“x++ is %d.n”,x++);
/*11 */ printf(“x is %d.nn”,x);
/*12 */
/*13 */ x = 4;
/*14 */ printf(“x is %d.n”,x);
/*15 */ printf(“--x is %d.n”,--x);
/*16 */ printf(“x is %d.n”,x);
/*17 */ getch();
/*18 */ return 0;
/*19 */ }
int a = 20;
b = a++ * 2;
int a = 20;
c = ++a * 2;
ผลลัพธ์
……………………………………..
……………………………………..
…………………………………….
……………………………………..
……………………………………..
……………………………………..
……………………………………..
เอกสารประกอบการสอน ภาษาซี
โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี
หน้า 32
ตัวอย่าง 3.3 โปรแกรมแสดงการเพิ่มค่าและลดค่าตัวแปรในแบบย่อ
/* 1 */ //Program : IncDec2.c
/* 2 */ // เพิ่มและลดค่าตัวแปรในแบบย่อ
/* 3 */
/* 4 */ #include <stdio.h>
/* 5 */ #include <conio.h>
/* 6 */ int main(){
/* 7 */ int x = 3, y;
/* 8 */
/* 9 */ y = x++;
/*10 */ printf(“x is %d, and y is %d.n”,x,y);
/*11 */ y = ++x;
/*12 */ printf(“Now x is %d, and y is %d.n”,x,y);
/*13 */ y = 5 % --x;
/*14 */ printf(“Now x is %d, and y is %d.n”,x,y);
/*15 */ printf(“Now x-- is %d, and ++y is %d.n”,x--,++y);
/*16 */ printf(“Now x is %d, and y is %d.n”,x,y);
/*17 */ getch();
/*18 */ return 0;
/*19 */ }
ผลลัพธ์
……………………………………..
……………………………………..
…………………………………….
……………………………………..
……………………………………..
……………………………………..
เอกสารประกอบการสอน ภาษาซี
โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี
หน้า 33
ใบงานที่ 3.1
ตัวดาเนินการคานวณ
1. กาหนดให้a, b และ c เป็นตัวแปรชนิดint และมีค่าเท่ากับ 4,5 และ 2 ตามลาดับ จงหา
ผลลัพธ์ของนิพจน์ต่อไปนี้
1.1 a % -b +5 ผลลัพธ์คือ ............................................................
1.2 c - b * a ผลลัพธ์คือ ............................................................
1.3 c * c + b * a / 3 ผลลัพธ์คือ ............................................................
1.4 a – b – c * a % b ผลลัพธ์คือ ............................................................
2. จากโปรแกรมIncDec2.c ในตัวอย่างที่ 3.3 หน้า 32 ถ้าสมมติให้โปรแกรมในบรรทัดที่10 ถูก
แก้ไขเป็น
printf (“x is %d, and y is %d.n”, x--, y++);
ให้นักเรียนเติมผลลัพธ์ของคาสั่งprintf() ในบรรทัดที่10, 12 และ 14-16
บรรทัดที่ ผลลัพธ์
10 x is ____, and y is ____.
12 Now x is ____, and y is ____.
14 Now x is ____, and y is ____.
15 Now x-- is ____, and y++ is ____.
16 Now x is ____, and y is ____.
เอกสารประกอบการสอน ภาษาซี
โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี
หน้า 34
3. กาหนดให้a, b และc เป็นตัวแปรชนิดint และมีค่าเท่ากับ4, -3 และ9 ตามลาดับ ให้
แสดงผลลัพธ์ของคาสั่งprintf() ต่อไปนี้ โดยแต่ละคาสั่งไม่เกี่ยวข้องกัน
printf(“%d, %dn”, a + 2%a, ++b % a);
...................................................................................................................................................................................
printf(“%d, %d, %dn”, a + b + c++, 4 * b / 2, 4 / 2 * b);
...................................................................................................................................................................................
printf(“%d, %d, %dn”, ++b + ++c, a – 2, 2 * a % 3);
...................................................................................................................................................................................
Ad

Recommended

สรุปผลการแข่งྺันคอมพิว๶ตอร์53
สรุปผลการแข่งྺันคอมพิว๶ตอร์53
Komkai Pawuttanon
ใบความรู้ที่3 การจัดการเฟรม
ใบความรู้ที่3 การจัดการเฟรม
Komkai Pawuttanon
ผลงาน2554 คอมใหม่
ผลงาน2554 คอมใหม่
Komkai Pawuttanon
ใบความรู้ที่5 การสร้างภาพเคลื่อนไหว (Tweened Animation)
ใบความรู้ที่5 การสร้างภาพเคลื่อนไหว (Tweened Animation)
Komkai Pawuttanon
บทที่ 2 ตัวแปร
บทที่ 2 ตัวแปร
Komkai Pawuttanon
การเขียนโปรแกรมภาษาซี
การเขียนโปรแกรมภาษาซี
choco336
Computer programming
Computer programming
Jariyaa
โจทย์ปัญหา8.1
โจทย์ปัญหา8.1
anusong
Midterm
Midterm
Sirirat Mahawan
โครงสร้างการ๶ขียนโปรแกรมภาษาไพธอน
โครงสร้างการ๶ขียนโปรแกรมภาษาไพธอน
srinagarindra the princess mother school kanchanaburi
การเขียนฟังก์ชั่นในภาษา C
การเขียนฟังก์ชั่นในภาษา C
Warawut
สมบัติการเท่ากัน
สมบัติการเท่ากัน
Aon Narinchoti
C lang
C lang
Nattawut Pornonsung
[สรุปสูตร] สรุปสูตรคณิตศาสตร์เพิ่มเติม ม456
[สรุปสูตร] สรุปสูตรคณิตศาสตร์เพิ่มเติม ม456
kanjana2536
Open คณิตศาสตร์ (พื้นฐาน) ม.6 หน่วย3_การวิเคราะห์ข้อมูลเบื้องต้น(2).pdf
Open คณิตศาสตร์ (พื้นฐาน) ม.6 หน่วย3_การวิเคราะห์ข้อมูลเบื้องต้น(2).pdf
mingkwankanyarat
ใบความรู้ที่ 4 การจัดการคีย์เฟรม
ใบความรู้ที่ 4 การจัดการคีย์เฟรม
Komkai Pawuttanon
ใบความรู้ที่2 การจัดการซีน
ใบความรู้ที่2 การจัดการซีน
Komkai Pawuttanon

More Related Content

Similar to บทที่ 3 (20)

Computer programming
Computer programming
Jariyaa
โจทย์ปัญหา8.1
โจทย์ปัญหา8.1
anusong
Midterm
Midterm
Sirirat Mahawan
โครงสร้างการ๶ขียนโปรแกรมภาษาไพธอน
โครงสร้างการ๶ขียนโปรแกรมภาษาไพธอน
srinagarindra the princess mother school kanchanaburi
การเขียนฟังก์ชั่นในภาษา C
การเขียนฟังก์ชั่นในภาษา C
Warawut
สมบัติการเท่ากัน
สมบัติการเท่ากัน
Aon Narinchoti
C lang
C lang
Nattawut Pornonsung
[สรุปสูตร] สรุปสูตรคณิตศาสตร์เพิ่มเติม ม456
[สรุปสูตร] สรุปสูตรคณิตศาสตร์เพิ่มเติม ม456
kanjana2536
Open คณิตศาสตร์ (พื้นฐาน) ม.6 หน่วย3_การวิเคราะห์ข้อมูลเบื้องต้น(2).pdf
Open คณิตศาสตร์ (พื้นฐาน) ม.6 หน่วย3_การวิเคราะห์ข้อมูลเบื้องต้น(2).pdf
mingkwankanyarat
Computer programming
Computer programming
Jariyaa
โจทย์ปัญหา8.1
โจทย์ปัญหา8.1
anusong
การเขียนฟังก์ชั่นในภาษา C
การเขียนฟังก์ชั่นในภาษา C
Warawut
สมบัติการเท่ากัน
สมบัติการเท่ากัน
Aon Narinchoti
[สรุปสูตร] สรุปสูตรคณิตศาสตร์เพิ่มเติม ม456
[สรุปสูตร] สรุปสูตรคณิตศาสตร์เพิ่มเติม ม456
kanjana2536
Open คณิตศาสตร์ (พื้นฐาน) ม.6 หน่วย3_การวิเคราะห์ข้อมูลเบื้องต้น(2).pdf
Open คณิตศาสตร์ (พื้นฐาน) ม.6 หน่วย3_การวิเคราะห์ข้อมูลเบื้องต้น(2).pdf
mingkwankanyarat

More from Komkai Pawuttanon (7)

ใบความรู้ที่ 4 การจัดการคีย์เฟรม
ใบความรู้ที่ 4 การจัดการคีย์เฟรม
Komkai Pawuttanon
ใบความรู้ที่2 การจัดการซีน
ใบความรู้ที่2 การจัดการซีน
Komkai Pawuttanon
บทที่1 พื้นฐานโปรแกรมภาษาซี
บทที่1 พื้นฐานโปรแกรมภาษาซี
Komkai Pawuttanon
บทคัึϸ่อ
บทคัึϸ่อ
Komkai Pawuttanon
ประวัติราชการ
ประวัติราชการ
Komkai Pawuttanon
การอบรม สัมมนา
การอบรม สัมมนา
Komkai Pawuttanon
ผลงานปี 2555_คอม
ผลงานปี 2555_คอม
Komkai Pawuttanon
ใบความรู้ที่ 4 การจัดการคีย์เฟรม
ใบความรู้ที่ 4 การจัดการคีย์เฟรม
Komkai Pawuttanon
ใบความรู้ที่2 การจัดการซีน
ใบความรู้ที่2 การจัดการซีน
Komkai Pawuttanon
บทที่1 พื้นฐานโปรแกรมภาษาซี
บทที่1 พื้นฐานโปรแกรมภาษาซี
Komkai Pawuttanon
ประวัติราชการ
ประวัติราชการ
Komkai Pawuttanon
การอบรม สัมมนา
การอบรม สัมมนา
Komkai Pawuttanon
ผลงานปี 2555_คอม
ผลงานปี 2555_คอม
Komkai Pawuttanon
Ad

บทที่ 3

  • 1. บทที่ 3 ตัวดาเนินการ (Operators) ฅัวดาเนินการคานวณพื้นฐานมีดังนี้ + ตัวดาเนินการ บวก - ตัวดาเนินการ ลบ * ตัวดาเนินการ คูณ / ตัวดาเนินการ หาร % ตัวดาเนินการมอดูลัส(Modulus) หรือหารแล้วเอาเฉพาะเศษนั่นเอง เราสามารถใช้ตัวดาเนินการคานวณเหล่านี้ทาการคานวณแล้วเก็บค่าไว้ในตัวแปรหรือแสดงผลลัพธ์ออกมาเลย ก็ได้ ดังตัวอย่างต่อไปนี้ int x = 7, y = 3; int sum, mod, div; sum = x + y; mod = x % y; div = x / y; printf("sum = %dn", sum); printf("x + y = %dn", x + y); printf("mod = %dn", mod); printf("div = %dn", div); printf("%d + %d + %d = %d", sum, mod, div, sum + mod + div); sum = 10 x + y = 10 mod = 1 div = 2 10 + 1 + 2 = 13 โค้ด ผลลัพธ์
  • 2. เอกสารประกอบการสอน ภาษาซี โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี หน้า 26 ถ้าสังเกตดีๆ จะเห็นว่า div หรือ x / y มีค่าเป็น 2 ไม่ใช่ 2.333 ทั้งนี้เพราะว่า int ทาอะไรกับ int ก็ต้องได้ int 7 / 3 = 2 (โดยคอมพิวเตอร์จะแปลง 2.333 ให้เป็น int ด้วยการปัดทศนิยมทิ้ง) ในทานองเดียวกัน double ทาอะไรกับ double ก็ย่อมได้ double ข้อมูลจาพวกตัวเลขประเภทอื่นก็เช่นเดียวกัน แล้วถ้า เลขสองตัวนั้น เป็นคนละประเภทล่ะ จะเป็นอย่างไร? int ทาอะไรกับ double ก็ต้องได้ double * อันนี้ต้องจา ระวังคานวณพลาดเพราะจุดนี้ แล้วถ้าอยากให้ 7 / 3 มีค่าเท่ากับ 2.333 ล่ะจะทาอย่างไร เราก็ต้องแปลง 7 กับ3 ตัวใดตัวหนึ่งหรือทั้งสองตัวให้เป็น double ก่อน มี 2 วิธี ดังนี้ 7.0 + 3.0 หรือ (double) 7 + (double) 3 วิธีแรกคือการเติม .0 ให้กับเลขจานวณเต็มเลขนั้นก็จะกลายเป็นเลขที่มีทศนิยมเป็น0 ซึ่งเป็นdouble ทันที ส่วนอีกวิธีหนึ่งคือการใส่(double) ไว้ด้านหน้าตัวเลขที่เราต้องการจะแปลงเลขตัวนั้นก็จะถูกเปลี่ยนให้เป็น double ทันที ในทานองเดียวกัน(int),(long),(float) ก็ทาได้เช่นกัน แต่ว่าวิธีแรกนั้น จะไม่สามารถใช้กับตัวแปรได้ต้องใช้วิธีหลังคือการเติม (double) เท่านั้นดังนี้ (double) x + (double) y โดยจะทาการแปลงค่าที่ถูกเรียกใช้มาจากตัวแปร x และ y เป็น double แต่ค่าที่เก็บไว้ใน x และ y ยังคงเป็น int เหมือนเดิม ไม่ถูกเปลี่ยนแปลง
  • 3. เอกสารประกอบการสอน ภาษาซี โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี หน้า 27 ทีนี้เราลองมาเขียนโค้ดกันดู อ้าว ไหนเราอุตส่าห์แปลงค่าจากตัวแปรให้เป็นdouble แล้วไง ทาไมยังได้ 2 อยู่ล่ะ ที่เป็นอย่างนี้ เพราะว่า div นั้นเป็นตัวแปรประเภท int นั่นเอง สิ่งที่จะเก็บเข้าตัวแปรประเภท int จะถูกแปลง ให้เป็น int โดยอัตโนมัติ ดังนั้นเราต้องประกาศ div ให้เป็นตัวแปรประเภท double ด้วย และอย่าลืมที่เปลี่ยน %d เป็น %lf ด้วย เดี๋ยวจะผิดซ้าสอง ผลลัพธ์ result = 2.333333 ก็เป็นอันที่เรียบร้อย int x = 7, y = 3; int div = (double) x / (double) y; printf("result = %d", div); โค้ด ผลลัพธ์ result = 2 int x = 7, y = 3; double div = (double) x / (double) y; printf("result = %lf", div); โค้ด
  • 4. เอกสารประกอบการสอน ภาษาซี โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี หน้า 28 Operator Precedence คือ ลาดับการทางานของตัวดาเนินการคานวณ 3 + 4 * 2 บางคนอาจสงสัยว่า ทาไมไม่เท่ากับ14 !! นั่นเป็นเพราะว่าคอมพิวเตอร์จะทาการคูณและหาร ก่อนบวกลบเสมอ เช่น 3 + 4 * 2 คอมพิวเตอร์จะทา4 * 2 ก่อน มีค่าเท่ากับ 8 แล้วค่อยทา 3 + 8 จึงได้ 11 นั่นเอง ถ้าอยากให้คอมพิวเตอร์ ทาการบวกก่อนการคูณ ให้ใส่เครื่องหมายวงเล็บ ( ) ครอบไว้ ดังนี้ คอมพิวเตอร์จะทาการประมวลผลเรียงลาดับดังนี้ 1. ( ) คอมพิวเตอร์จะทาการคานวณในวงเล็บก่อนเสมอ 2. * / % จากนั้นจะทาการคูณ หาร มอดูลัส เรียงจากซ้ายไปขวา เจอเครื่องหมายใดก่อนทาก่อน 3. + - และทาการบวก ลบ เรียงจากซ้ายไปขวาเช่นกัน ลองมาดูอีกซักตัวอย่าง เห็นเยอะๆ อย่าเพิ่งตกใจไป ก่อนอื่นขั้นแรกให้หยิบวงเล็บมาทาก่อนเลย 1 + 5 % ( 8 - 4 / 2 * 3 ) * 4 ในวงเล็บให้ทาเครื่องหมาย * / % เจอเครื่องหมายใดก่อน ทาก่อนจากซ้ายไปขวา ในที่นี้เราเจอ - ก่อนอับดับแรก จะยังไม่ทาข้ามไปก่อน จากนั้นเจอ /ทาเลย 4 / 2 = 2 แทนค่ากลับไปได้ 1 + 5 % ( 8 - 2 * 3) * 4 int x = 3 + 4 * 2; printf("%d", x); โค้ด 11 ผลลัพธ์ int x = ( 3 + 4 ) * 2; printf("%d", x); โค้ด 14 ผลลัพธ์ int x = 1 + 5 % ( 8 - 4 / 2 * 3 ) * 4; printf("%d", x); โค้ด 5 ผลลัพธ์
  • 5. เอกสารประกอบการสอน ภาษาซี โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี หน้า 29 จากนั้นเจอ *ทาเลย 2 * 3 = 6 แทนค่ากลับไปได้ 1 + 5 % ( 8 - 6) * 4 ตอนนี้ยังอยู่ในวงเล็บอยู่ เสร็จจากการทา * / % แล้ว ค่อยมาทา + - ก็จะได้8 - 6 = 2 แทนค่ากลับไปได้ 1 + 5 % 2 * 4 ในวงเล็บเหลือค่าเดียวแล้ว ถอดวงเล็บออกได้ เมื่อเสร็จจากการทาในวงเล็บแล้วต่อไปก็คือทา * / % ไล่จากซ้ายไปขวา เจอ + ยังไม่ทาเก็บไว้ก่อน เจอ % ทาเลย 5 % 2 = 1แทนค่ากลับไปได้ 1 + 1 * 4 จากนั้นทา * ก่อนได้1 * 4 = 4 แทนค่ากลับไปได้ 1 + 4 สุดท้ายจึงทาการบวกได้1 + 4 = 5 5 เป็นอันเสร็จสิ้น คาสั่งกาหนดค่าเชิงประกอบ คาสั่งกาหนดค่าเชิงประกอบ ( compound assignment) มีรูปแบบคือ c op= d; ซึ่งมีความหมายเทียบเท่ากับ c = c op d; เมื่อ op เป็นตัวดาเนินการคานวณใด ๆ( + - * / % ) โค้ด หมายถึง มีความหมายเหมือนกับ n++; เพิ่มค่า n ขึ้นอีก1 n = n + 1; n--; ลดค่า n ลงไป 1 n = n - 1; n+=5; เพิ่มค่า n เข้าไป5 n = n + 5; n-=13 ลดค่า n ลงมา 13 n = n – 13; n*=2 นา n มาคูณด้วย 2 n = n*2; n/=2 นา n มาหารด้วย 2 n = n/2;
  • 6. เอกสารประกอบการสอน ภาษาซี โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี หน้า 30 ตัวอย่าง 3.1 โปรแกรมแสดงการใช้คาสั่งกาหนดค่าเชิงประกอบ /* 1 */ //Program : CompAssi.c /* 2 */ //แสดงการใช้คาสั่งกาหนดค่าเชิงประกอบ /* 3 */ /* 4 */ #include <stdio.h> /* 5 */ #include <conio.h> /* 6 */ int main(){ /* 7 */ int a = 0, b = 5; /* 8 */ /* 9 */ a += 4; /*10 */ printf(“a is %d.n”,a); /*11 */ a *= 3; /*12 */ printf(“a is %d.n”,a); /*13 */ a /= 4; /*14 */ printf(“a is %d.n”,a); /*15 */ a %= 5; /*16 */ printf(“a is %d.n”,a); /*17 */ a = 7; /*18 */ a /= a - b; /*19 */ printf(“a is %d.n”,a); /*20 */ b *= b + a; /*21 */ printf(“b is %d.n”,b); /*22 */ getch(); /*23 */ return 0; /*24 */ } คาสั่งเพิ่มและลดค่า นอกจากการใช้คาสั่งกาหนดค่าเชิงประกอบแล้ว ภาษาซียังมีรูปแบบการเขียนคาสั่งเพื่อเพิ่มหรือลดค่า ตัวแปรชนิดจานวนเต็มทีละ1 ในแบบย่อ โดยอาศัยตัวดาเนินการเอกภาคเพิ่มค่า ++ และตัวดาเนินการเอก ภาคลดค่า -- ดังตัวอย่างต่อไปนี้ รูปที่3.1 ตัวดาเนินการเอกภาคเพิ่มค่า รูปที่ 3.2 ตัวดาเนินการเอกภาคลดค่า แต่ละคาสั่งด้านบนจะมีผลให้ x ในรูปที่3.1 มีค่าเพิ่มขึ้นทีละ 1 และ y ในรูปที่3.2 มีค่าลดลงทีละ 1 ดังนั้นหลังจากประมวลผลคาสั่งข้างต้นแล้ว x และ y จะมีค่าเป็น7 และ 5 ตามลาดับ ผลลัพธ์ …………………………………….. …………………………………….. ……………………………………. …………………………………….. …………………………………….. …………………………………….. …………………………………….. int x = 4; x = x + 1; x += 1; x++; int y = 8; y = y - 1; y -= 1; --y;
  • 7. เอกสารประกอบการสอน ภาษาซี โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี หน้า 31 ตัวดาเนินการ ++ และตัวดาเนินการ -- อาจวางอยู่ด้านหลังหรือด้านหน้าตัวแปร ดังเช่น x++ หรือ ++x เป็นต้น เมื่อวางตัวดาเนินการเอกภาคเพิ่มค่า (หรือเอกภาคลดค่า) ไว้ด้านหลังตัวแปร จะมีผลให้การเพิ่ม (หรือ ลด) ค่าตัวแปรอีก 1 เกิดขึ้นหลังจากการอ้างอิงค่าตัวแปรดังกล่าวในคาสั่งเดียวกัน และเมื่อวางตัวดาเนินการเอก ภาคเพิ่มค่า (หรือเอกภาคลดค่า) ไว้ด้านหน้าตัวแปร จะมีผลให้การเพิ่ม (หรือลด) ค่าตัวแปรอีก1 เกิดขึ้นก่อน จากการอ้างอิงค่าตัวแปรดังกล่าวในคาสั่งเดียวกัน เช่น รูปที่ 3.3 เพิ่มค่าหลังการอ้างอิง รูปที่ 3.4 เพิ่มค่าก่อนการอ้างอิง คาสั่งในรูปที่ 3.3 จะมีผลให้ตัวแปรb มีค่าเท่ากับ 40 และ คาสั่งในรูปที่ 3.4 จะมีผลให้ตัวแปรc มี ค่าเท่ากับ 42 ในขณะที่ตัวแปรa ทั้งสองกรณีมีค่าเป็น 21 ตัวอย่าง 3.2 โปรแกรมแสดงการเพิ่มค่าและลดค่าตัวแปรในแบบย่อ /* 1 */ //Program : IncDec1.c /* 2 */ // เพิ่มและลดค่าตัวแปรในแบบย่อ /* 3 */ /* 4 */ #include <stdio.h> /* 5 */ #include <conio.h> /* 6 */ int main(){ /* 7 */ int x = 8; /* 8 */ /* 9 */ printf(“x is %d.n”,x); /*10 */ printf(“x++ is %d.n”,x++); /*11 */ printf(“x is %d.nn”,x); /*12 */ /*13 */ x = 4; /*14 */ printf(“x is %d.n”,x); /*15 */ printf(“--x is %d.n”,--x); /*16 */ printf(“x is %d.n”,x); /*17 */ getch(); /*18 */ return 0; /*19 */ } int a = 20; b = a++ * 2; int a = 20; c = ++a * 2; ผลลัพธ์ …………………………………….. …………………………………….. ……………………………………. …………………………………….. …………………………………….. …………………………………….. ……………………………………..
  • 8. เอกสารประกอบการสอน ภาษาซี โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี หน้า 32 ตัวอย่าง 3.3 โปรแกรมแสดงการเพิ่มค่าและลดค่าตัวแปรในแบบย่อ /* 1 */ //Program : IncDec2.c /* 2 */ // เพิ่มและลดค่าตัวแปรในแบบย่อ /* 3 */ /* 4 */ #include <stdio.h> /* 5 */ #include <conio.h> /* 6 */ int main(){ /* 7 */ int x = 3, y; /* 8 */ /* 9 */ y = x++; /*10 */ printf(“x is %d, and y is %d.n”,x,y); /*11 */ y = ++x; /*12 */ printf(“Now x is %d, and y is %d.n”,x,y); /*13 */ y = 5 % --x; /*14 */ printf(“Now x is %d, and y is %d.n”,x,y); /*15 */ printf(“Now x-- is %d, and ++y is %d.n”,x--,++y); /*16 */ printf(“Now x is %d, and y is %d.n”,x,y); /*17 */ getch(); /*18 */ return 0; /*19 */ } ผลลัพธ์ …………………………………….. …………………………………….. ……………………………………. …………………………………….. …………………………………….. ……………………………………..
  • 9. เอกสารประกอบการสอน ภาษาซี โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี หน้า 33 ใบงานที่ 3.1 ตัวดาเนินการคานวณ 1. กาหนดให้a, b และ c เป็นตัวแปรชนิดint และมีค่าเท่ากับ 4,5 และ 2 ตามลาดับ จงหา ผลลัพธ์ของนิพจน์ต่อไปนี้ 1.1 a % -b +5 ผลลัพธ์คือ ............................................................ 1.2 c - b * a ผลลัพธ์คือ ............................................................ 1.3 c * c + b * a / 3 ผลลัพธ์คือ ............................................................ 1.4 a – b – c * a % b ผลลัพธ์คือ ............................................................ 2. จากโปรแกรมIncDec2.c ในตัวอย่างที่ 3.3 หน้า 32 ถ้าสมมติให้โปรแกรมในบรรทัดที่10 ถูก แก้ไขเป็น printf (“x is %d, and y is %d.n”, x--, y++); ให้นักเรียนเติมผลลัพธ์ของคาสั่งprintf() ในบรรทัดที่10, 12 และ 14-16 บรรทัดที่ ผลลัพธ์ 10 x is ____, and y is ____. 12 Now x is ____, and y is ____. 14 Now x is ____, and y is ____. 15 Now x-- is ____, and y++ is ____. 16 Now x is ____, and y is ____.
  • 10. เอกสารประกอบการสอน ภาษาซี โรงเรียนวิสุทธรังษี จังหวัดกาญจนบุรี หน้า 34 3. กาหนดให้a, b และc เป็นตัวแปรชนิดint และมีค่าเท่ากับ4, -3 และ9 ตามลาดับ ให้ แสดงผลลัพธ์ของคาสั่งprintf() ต่อไปนี้ โดยแต่ละคาสั่งไม่เกี่ยวข้องกัน printf(“%d, %dn”, a + 2%a, ++b % a); ................................................................................................................................................................................... printf(“%d, %d, %dn”, a + b + c++, 4 * b / 2, 4 / 2 * b); ................................................................................................................................................................................... printf(“%d, %d, %dn”, ++b + ++c, a – 2, 2 * a % 3); ...................................................................................................................................................................................