ภาษาC
ภาษาซี (C)
เป็นภาษาโปรแกรมสำหรับวัตถุประสงค์ทั่วไป
เริ่มพัฒนาขึ้นระหว่าง พ.ศ. 2512-2516 (ค.ศ. 1969-1973) โดยเดนนิส ริชชี่ (Denis
Retchie) ที่เอทีแอนด์ทีเบลล์แล็บส์ (AT&T Bell Labs) ภาษาซีเป็นภาษาที่มีความยืดหยุ่นในการเขียนโปรแกรมและมีเครื่องมืออำนวยความสะดวกสำหรับการเขียนโปรแกรมเชิงโครงสร้างและอนุญาตให้มีขอบข่ายตัวแปร
(scope) และการเรียกซ้ำ (recursion) ในขณะที่ระบบชนิดตัวแปรอพลวัตก็ช่วยป้องกันการดำเนินการที่ไม่ตั้งใจหลายอย่าง
เหมือนกับภาษาโปรแกรมเชิงคำสั่งส่วนใหญ่ในแบบแผนของภาษาอัลกอล
การออกแบบของภาษาซีมีคอนสตรักต์ (construct) ที่โยงกับชุดคำสั่งเครื่องทั่วไปได้อย่างพอเพียง
จึงทำให้ยังมีการใช้ในโปรแกรมประยุกต์ซึ่งแต่ก่อนลงรหัสเป็นภาษาแอสเซมบลี
คือซอฟต์แวร์ระบบอันโดดเด่นอย่างระบบปฏิบัติการคอมพิวเตอร์ ยูนิกซ์
ประวัติของภาษา C
ภาษา
C
นั้นถูกพัฒนาครั้งแรกโดย Dennis Ritchie ในระหว่างปี
1969 และ 1973 ที่ Bell Labs และใช้สำหรับพัฒนาและปรับปรุงระบบปฏิการ
Unix ใหม่
ตั้งแต่นั้นมันได้มาเป็นภาษาที่มีการใช้งานอย่างกว้างขวางมากที่สุดตลอดเวลา
ที่มากับ C คอมไพเลอร์จากบริษัทพัฒนาต่างๆ
สำหรับพัฒนาในสถาปัตยกรรมคอมพิวเตอร์และระบบปฏิบัติการที่ได้รับความนิยมเป็นจำนวนมาก
ภาษา C ได้ถูกกำหนดมาตฐานโดย American National
Standards Institute (ANSI) ตั้งแต่ปี 1989 และ International
Organization for Standardization (ISO) ในเวลาต่อมา
ภาษา
C
เป็นภาษาที่มีรูปแบบการเขียนโปรแกรมเป็นแบบลำดับ (imperative
procedural) ให้ถูกออกแบบให้คอมไพล์อย่างตรงไปตรงมากับคอมไพเลอร์ที่มีความเกี่ยวข้อง
เพื่อให้สามารถเข้าถึงการจัดการหน่วยความจำในระดับต่ำ
และทำให้โครงสร้างของภาษาเชื่อมโยงกับคำสั่งการทำงานของคอมพิวเตอร์อย่างมีประสิทธิภาพ
ดังนั้น ภาษา C จึงมีประโยชน์กับการพัฒนาแอพพลิเคชันที่เคยเขียนโดยภาษา
Assembly ยกตัวอย่าง เช่น โปรแกรมระบบ
เครื่องมือพัฒนาสำหรับภาษา C
ในการที่จะเขียนโปรแกรมในภาษา
C
คุณต้องการ IDE เพื่อช่วยในการพัฒนาโปรแกรมของคุณ
IDE เป็นโปรแกรมที่รวบรวมเครื่องมือที่จำเป็นในการพัฒนา
มันเป็นซอฟแวร์ประยุกต์ที่อำนวยความสะดวกเป็นอย่างมากสำหรับนักเขียนโปรแกรมคอมพิวเตอร์และนักพัฒนาซอฟแวร์สำหรับการพัฒนาโปรแกรม
โดยปกติแล้ว IDE จะประกอบไปด้วยโปรแกรมแก้ไขข้อความ
ตัวดีบักโปรแกรม และอื่นๆ
IDE
สามารถเป็นโปรแกรมแก้ไขข้อความใดๆ เช่น notepad แต่ในบทเรียนภาษา C นี้ เราจะแนะนำให้คุณใช้ Code
Block ในการเขียน เพราะมันมีคุณสมบัติหลายอย่างที่สนับสนุนภาษา C
มันฟรีและสามารถใช้ได้บนแพลตฟอร์มต่างๆ เช่น Windows Linux และ MacOS ซึ่งมากับคอมไพเลอร์ GCC
โครงสร้างโปรแกรมภาษาซี
โครงสร้างของโปรแกรมภาษาซีแบ่งออกเป็น
3 ส่วน
1.
ส่วนหัวของโปรแกรม ส่วนหัวของโปรแกรมนี้เรียกว่า Preprocessing
Directive ใช้ระบุเพื่อบอกให้คอมไพเลอร์กระทำการ ใด ๆ
ก่อนการแปลผลโปรแกรม ในที่นี่คำสั่ง #include <stdio.h> ใช้บอกกับคอมไพเลอร์ให้นำเฮดเดอร์ไฟล์ที่ระบุ คือ stdio.h เข้าร่วมในการแปลโปรแกรมด้วย โดยการกำหนด preprocessing directives
นี้จะต้องขึ้นต้นด้วยเครื่องหมาย # เสมอ
คำสั่งที่ใช้ระบุให้คอมไพเลอร์นำเฮดเดอร์ไฟล์เข้าร่วมในการแปลโปรแกรม
สามารถเขียนได้ 2 รูปแบบ คือ
© #include
<ชื่อเฮดเดอร์ไฟล์> คอมไพเลอร์จะทำการค้นหาเฮดเดอร์ไฟล์ที่ระบุจากไดเรกทอรีที่ใช้สำหรับเก็บเฮดเดอร์ไฟล์โดยเฉพาะ
(ปกติคือไดเรกทอรีชื่อ include)
© #include
“ชื่อเฮดเดอร์ไฟล์” คอมไพเลอร์จะทำการค้นหาเฮดเดอร์ไฟที่ระบุ
จากไดเร็คทอรีเดียวกันกับไฟล์ source code นั้น
แต้ถ้าไม่พบก็จะไปค้นหาไดเร็คทอรีที่ใช้เก็บเฮดเดอร์ไฟล์โดยเฉพาะ
2.
ส่วนของฟังก์ชั่นหลัก
ฟังก์ชั่นหลักของภาษาซี
คือ ฟังก์ชั่น main() ซึ่งโปรแกรมภาษาซีทุกโปรแกรมจะต้องมีฟังก์ชั่นนี้อยู่ในโปรแกรมเสมอ
จะเห็นได้จากชื่อฟังก์ชั่นคือ main แปลว่า “หลัก” ดังนั้น
การเขียนโปรแกรมภาษซีจึงขาดฟังก์ชั่นนี้ไปไม่ได้ โดยขอบเขตของฟังก์ชั่นจะถูกกำหนดด้วยเครื่องหมาย
{ และ } กล่าวคือ
การทำงานของฟังก์ชั่นจะเริ่มต้นที่เครื่องหมาย { และจะสิ้นสุดที่เครื่องหมาย
} ฟังก์ชั่น main() สามารถเขียนในรูปแบบของ
void main(void) ก็ได้ มีความหมายเหมือนกัน คือ หมายความว่า
ฟังก์ชั่น main() จะไม่มีอาร์กิวเมนต์ (argument) คือไม่มีการรับค่าใด ๆ เข้ามาประมวลผลภายในฟังก์ชั่น
และจะไม่มีการคืนค่าใด ๆ กลับออกไปจากฟังก์ชั่นด้วย
3.
ส่วนรายละเอียดของโปรแกรม
เป็นส่วนของการเขียนคำสั่ง
เพื่อให้โปรแกรมทำงานตามที่ได้ออกแบบไว้
โครงสร้างภาษาซีเบื้องต้น
1.
โครงสร้างโปรแกรม แบ่งออกเป็น 5 ส่วน คือ
1.1
Preprocessor Directive ปรีโปรเซสเซอร์ไดเร็กทีฟ
- ทุกโปรแกรมต้องมีส่วนนี้
-
ใช้เรียกไฟล์ที่โปรแกรมจะใช้ในการทำงานก่อนการคอมไพล์
- ใช้กำหนดค่าคงที่ให้กับโปรแกรม
- เริ่มต้นด้วยเครื่องหมาย #
- ที่เราจะใช้บ่อยกันมี 2
directives คือ
- #include ใช้สำหรับเรียกไฟล์ที่โปรแกรมใชในการทำงาน
- #define ใช้สำหรับกำหนดมาโครที่ให้กับโปรแกรม
1.2
Global Declarations ส่วนประกาศ
- เป็นการประกาศตัวแปรเพื่อใช้งานในโปรแกรม
โดยตัวแปรนั้นสามารถใช้ได้ในทุกที่
- เป็นส่วนที่ใช้ในการประกาศ Function
Prototype ของโปรแกรม
- ส่วนนี้ในบางโปรแกรมอาจจะไม่มีก็ได้
1.3
Main Function ส่วนฟังก์ชั่นหลัก
- ส่วนนี้ทุกโปรแกรมจะต้องมีโดยโปรแกรมหลักจะเริ่มต้นด้วยmain()
และและปีกกาปิด
- ระหว่างปีกกาจะประกอบไปด้วยคำสั่ง(Statement)
ต่างๆ ที่จะให้โปรแกรมทำงาน
- แต่ละคำสั่งจะต้องจบด้วยเซมิโคลอน ‘;’
(Semicolon)
1.4
User Define Function ส่วนกำหนดฟังก์ชันใช้งานเอง
- ระหว่างปีกกาจะประกอบด้วยคำสั่ง(Statement)
ต่างๆ ที่จะให้ฟังก์ชันทำงาน
- สามารถเรียกใช้ภายในโปรแกรมได้ทุกที่
1.5
Program Comments ส่วนอธิบายโปนแกรม
- ใช้เขียนส่วนอธิบายโปรแกรม (คอมเมนต์)
-
ช่วยให้ผู้ศึกษาโปรแกรมภายหลังเข้าใจการทำงานของโปรแกรม
- ส่วนของคำอธิบายจะถูกข้ามเมื่อคอมไพล์โปรแกรม
2.
โปรแกรมภาษาซีเบื้องต้น จะถูกแบ่งเป็นสองส่วน
« ส่วนหัวของโปรแกรม(Header
file)
« ใช้กำหนดคำสั่งและข้อกำหนดต่างๆที่โปรแกรมจะทำงานตาม#include
<stdio.h>
« ส่วนของคำสั่งหลัก(Main
function)
« ใส่คำสั่งต่างๆ main() {
statement ; }
คอมเมนต์ในภาษาซี
คอมเมนต์ (comment) คือส่วนที่เป็นหมายเหตุของโปรแกรม
มีไว้เพื่อให้ผู้เขียนโปรแกรมใส่ข้อความอธิบายกำกับลงไปใน source code ซึ่งคอมไพเลอร์จะข้ามาการแปลผลในส่วนที่เป็นคอมเมนต์นี้
คอมเมนต์ในภาษาซีมี 2 แบบคือ
- คอมเมนต์แบบบรรทัดเดียว
ใช้เครื่องหมาย //
- คอมเมนต์แบบหลายบรรทัด
ใช้เครื่องหมาย /* และ */
จะเห็นว่าในกรณีที่ต้องการใส่คอมเมนต์หลาย ๆ
บรรทัดติดกันนั้น
คอมเมนต์แบบหลายบรรทัดจะช่วยประหยัดเวลาในการใส่คอมเมนต์ได้มากกว่าการใช้คอมเมนต์แบบบรรทัดเดียว
แต่ก็ควรระมัดระวังในการใช้งานด้วย
ในการที่จะเขียนโปรแกรมในภาษา C คุณต้องการ IDE เพื่อช่วยในการพัฒนาโปรแกรมของคุณ IDE
เป็นโปรแกรมที่รวบรวมเครื่องมือที่จำเป็นในการพัฒนา
มันเป็นซอฟแวร์ประยุกต์ที่อำนวยความสะดวกเป็นอย่างมากสำหรับนักเขียนโปรแกรมคอมพิวเตอร์และนักพัฒนาซอฟแวร์สำหรับการพัฒนาโปรแกรม
โดยปกติแล้ว IDE จะประกอบไปด้วยโปรแกรมแก้ไขข้อความ
ตัวดีบักโปรแกรม และอื่นๆ
IDE
สามารถเป็นโปรแกรมแก้ไขข้อความใดๆ เช่น notepad แต่ในบทเรียนภาษา C นี้ เราจะแนะนำให้คุณใช้ Code
Block ในการเขียน เพราะมันมีคุณสมบัติหลายอย่างที่สนับสนุนภาษา C
มันฟรีและสามารถใช้ได้บนแพลตฟอร์มต่างๆ เช่น Windows Linux และ MacOS ซึ่งมากับคอมไพเลอร์ GCC
1. โครงสร้างโปรแกรม แบ่งออกเป็น 5 ส่วน คือ
1.1 Preprocessor Directive ปรีโปรเซสเซอร์ไดเร็กทีฟ
-
ทุกโปรแกรมต้องมีส่วนนี้
-
ใช้เรียกไฟล์ที่โปรแกรมจะใช้ในการทำงานก่อนการคอมไพล์
-
ใช้กำหนดค่าคงที่ให้กับโปรแกรม
-
เริ่มต้นด้วยเครื่องหมาย #
- ที่เราจะใช้บ่อยกันมี
2
directives คือ
- #include
ใช้สำหรับเรียกไฟล์ที่โปรแกรมใชในการทำงาน
- #define ใช้สำหรับกำหนดมาโครที่ให้กับโปรแกรม
1.2 Global Declarations ส่วนประกาศ
-
เป็นการประกาศตัวแปรเพื่อใช้งานในโปรแกรม
โดยตัวแปรนั้นสามารถใช้ได้ในทุกที่
- เป็นส่วนที่ใช้ในการประกาศ
Function
Prototype ของโปรแกรม
-
ส่วนนี้ในบางโปรแกรมอาจจะไม่มีก็ได้
1.3 Main Function ส่วนฟังก์ชั่นหลัก
-
ส่วนนี้ทุกโปรแกรมจะต้องมีโดยโปรแกรมหลักจะเริ่มต้นด้วยmain()
และและปีกกาปิด
-
ระหว่างปีกกาจะประกอบไปด้วยคำสั่ง(Statement) ต่างๆ
ที่จะให้โปรแกรมทำงาน
-
แต่ละคำสั่งจะต้องจบด้วยเซมิโคลอน ‘;’ (Semicolon)
1.4 User Define Function ส่วนกำหนดฟังก์ชันใช้งานเอง
-
ระหว่างปีกกาจะประกอบด้วยคำสั่ง(Statement) ต่างๆ
ที่จะให้ฟังก์ชันทำงาน
-
สามารถเรียกใช้ภายในโปรแกรมได้ทุกที่
1.5 Program Comments ส่วนอธิบายโปนแกรม
-
ใช้เขียนส่วนอธิบายโปรแกรม (คอมเมนต์)
-
ช่วยให้ผู้ศึกษาโปรแกรมภายหลังเข้าใจการทำงานของโปรแกรม
-
ส่วนของคำอธิบายจะถูกข้ามเมื่อคอมไพล์โปรแกรม
2. โปรแกรมภาษาซีเบื้องต้น
จะถูกแบ่งเป็นสองส่วน
- ส่วนหัวของโปรแกรม(Header
file)
- ใช้กำหนดคำสั่งและข้อกำหนดต่างๆที่โปรแกรมจะทำงานตาม#include
<stdio.h>
- ส่วนของคำสั่งหลัก(Main
function)
-
ใส่คำสั่งต่างๆ
ใส่คำสั่งต่างๆ
« main()
« {
« statement
;
«
}
J ไม่มีการนิยามฟังก์ชันซ้อนใน
J ไม่มีการกำหนดค่าแถวลำดับหรือสายอักขระโดยตรง
(การคัดลอกข้อมูลจะกระทำผ่านฟังก์ชันมาตรฐาน
แต่ก็รองรับการกำหนดค่าวัตถุที่มีชนิดเป็น struct หรือ union)
J ไม่มีการเก็บข้อมูลขยะโดยอัตโนมัติ
J ไม่มีข้อกำหนดเพื่อการตรวจสอบขอบเขตของแถวลำดับ
J ไม่มีการดำเนินการสำหรับแถวลำดับทั้งชุดในระดับตัวภาษา
J ไม่มีวากยสัมพันธ์สำหรับช่วงค่า
(range)
เช่น A..B ที่ใช้ในบางภาษา
J ก่อนถึงภาษาซี99 ไม่มีการแบ่งแยกชนิดข้อมูลแบบบูล (ค่าศูนย์หรือไม่ศูนย์ถูกนำมาใช้แทน)
J ไม่มีส่วนปิดคลุมแบบรูปนัย
(closure)
หรือฟังก์ชันในรูปแบบพารามิเตอร์ (มีเพียงตัวชี้ของฟังก์ชันและตัวแปร)
J ไม่มีตัวสร้างและโครูทีน
การควบคุมกระแสการทำงานภายในเทร็ดมีเพียงการเรียกใช้ฟังก์ชันซ้อนลงไป
เว้นแต่การใช้ฟังก์ชัน longjmp หรือ setcontext
จากไลบรารี
J ไม่มีการจัดกระทำสิ่งผิดปรกติ
(exception
handling) ฟังก์ชันไลบรารีมาตรฐานจะแสดงเงื่อนไขข้อผิดพลาดด้วยตัวแปรส่วนกลาง
errno และ/หรือค่ากลับคืนพิเศษ และฟังก์ชันไลบรารีได้เตรียม goto
แบบไม่ใช่เฉพาะที่ไว้ด้วย
J การเขียนโปรแกรมเชิงมอดูลรองรับแค่ระดับพื้นฐานเท่านั้น
J การโอเวอร์โหลดฟังก์ชันหรือตัวดำเนินการไม่รองรับภาวะหลายรูปแบบขณะแปลโปรแกรม
J การเขียนโปรแกรมเชิงวัตถุรองรับในระดับที่จำกัดมาก
โดยพิจารณาจากภาวะหลายรูปแบบกับการรับทอด (inheritance)
J การซ่อนสารสนเทศ
(encapsulation)
รองรับในระดับที่จำกัด
J ไม่รองรับโดยพื้นฐานกับการทำงานแบบมัลติเทร็ดและเครือข่ายคอมพิวเตอร์
การดำเนินการหลายอย่างในภาษาซีมีพฤติกรรมไม่นิยามซึ่งไม่ถูกกำหนดว่าต้องตรวจสอบขณะแปลโปรแกรม
ในกรณีของภาษาซี "พฤติกรรมไม่นิยาม"
หมายถึงพฤติกรรมเฉพาะอย่างที่เกิดขึ้นโดยมาตรฐานมิได้ระบุไว้
และสิ่งที่จะเกิดขึ้นก็ไม่มีในเอกสารการใช้งานของภาษาซี หนึ่งในชุดคำสั่งที่มีชื่อเสียงและน่าขบขันจากกลุ่มข่าว
comp.std.c
และ comp.lang.c นั้นทำให้โปรแกรมเกิดปัญหาที่เรียกว่า
"ปิศาจที่ออกมาจากจมูกของคุณ" (demons to fly out of your nose) บางครั้งสิ่งที่เกิดขึ้นในทางปฏิบัติอันเป็นผลมาจากพฤติกรรมไม่นิยามทำให้เกิดจุดบกพร่องที่ยากต่อการตรวจสอบและอาจทำให้ข้อมูลในหน่วยความจำผิดแปลกไป
ตัวแปลโปรแกรมบางชนิดช่วยสร้างการดำเนินงานที่ทำให้พฤติกรรมนั้นดีขึ้นและมีเหตุผล
ซึ่งแตกต่างจากการแปลโดยตัวแปลชนิดอื่นที่อาจดำเนินงานไม่เหมือนกัน
สาเหตุที่พฤติกรรมบางอย่างยังคงไว้ว่าไม่นิยามก็เพื่อให้ตัวแปลโปรแกรมบนสถาปัตยกรรมชุดของคำสั่งเครื่องที่หลากหลาย
สามารถสร้างรหัสที่ทำงานได้ในพฤติกรรมที่นิยามอย่างมีประสิทธิภาพมากขึ้น
ซึ่งเชื่อว่าเป็นบทบาทหนึ่งที่สำคัญของภาษาซีในฐานะภาษาสำหรับสร้างระบบ
ดังนั้นภาษาซีจึงส่งผลให้เกิดความรับผิดชอบของโปรแกรมเมอร์เพื่อหลีกเลี่ยงพฤติกรรมไม่นิยาม
โดยอาจใช้เครื่องมือต่าง ๆ
เพื่อค้นหาส่วนของโปรแกรมว่าพฤติกรรมใดบ้างที่ไม่นิยาม
ตัวอย่างของพฤติกรรมไม่นิยามเช่น
L การเข้าถึงข้อมูลนอกขอบเขตของแถวลำดับ
L ข้อมูลล้น
(overflow)
ในตัวแปรจำนวนเต็มมีเครื่องหมาย
L ฟังก์ชันที่กำหนดไว้ว่าต้องส่งค่ากลับ
แต่ไม่มีคำสั่งส่งกลับ (return) ในฟังก์ชัน
ในขณะเดียวกันค่าส่งกลับก็ถูกใช้งานด้วย
L การอ่านค่าตัวแปรโดยที่ยังไม่ได้กำหนดค่าเริ่มต้น
ความคิดเห็น
แสดงความคิดเห็น