การเขียนโปรแกรมภาษา C (ตอนที่ 1)#

 

หัวข้อสำหรับการเรียนรู้#

  • โครงสร้างของโปรแกรมภาษาซี (C Program Structure)
  • คำอธิบายโค้ด (Code Comments)
  • ตัวแปร (Variables)
  • ตัวแปรค่าคงที่ (Constant Variables)
  • ข้อมูลค่าคงที่ (Literals)
  • ลำดับหลีก (Escape Sequences)
  • ตัวระบุชื่อ (Identifiers)
  • คำสงวนในภาษาซี (C Reserved Words)
  • ขอบเขตการใช้งานตัวแปร (Scope of Variables)

บทความที่เกี่ยวข้อง#

  • "การใช้ GNU C/C++ Toolchain สำหรับการคอมไพล์โค้ดในเบื้องต้น" [→]
  • "การใช้ซอฟต์แวร์ Geany เพื่อการเขียนโปรแกรมภาษา C/C++ สำหรับ Linux" [→]

หนังสือสำหรับการเรียนรู้และเอกสารอ้างอิงเกี่ยวกับภาษาซี#

  • [PDF] "Modern C (2nd Edition, 2019)" by J.Gustedt, Creative Commons Attribution - NonCommercial 4.0 International License.
  • [PDF] "The GNU C Reference Manual" by T. Rothwell & J.Youngman
  • [PDF] "The GNU C Library Reference Manual by S. Loosemore, et al.

 


โครงสร้างพื้นฐานของโปรแกรมภาษาซี (Basic Structure of a C Program)#

ซอร์สโค้ดภาษาซี (C Source Code) จะประกอบด้วยอย่างน้อยหนึ่งไฟล์ที่มีนามสกุล .c เรียกว่า C Source Code File หรือมีหลายไฟล์ได้ในโปรเจกต์เดียวกัน และอาจมีไฟล์ที่มีนามสกุล .h ซึ่งหมายถึง C Header File เช่น มีการกำหนดสัญลักษณ์และค่าคงที่ หรือมีการกำหนดรูปแบบของฟังก์ชัน (เรียกว่า Function Prototype) ที่จะถูกสร้างขึ้นมาและมีการเรียกใช้ฟังก์ชันเหล่านั้น (Function Call) ในโค้ดส่วนต่าง ๆ ของโปรแกรม เป็นต้น

ไฟล์ต่าง ๆ ที่เป็นซอร์สโค้ดของโปรแกรมภาษาซี จะต้องนำไปผ่านขั้นตอนการคอมไพล์ (Compilation) โดยใช้โปรแกรมประเภทที่เรียกว่า "คอมไพเลอร์สำหรับภาษาซี" (C Compiler) และทำงานได้ตามมาตรฐานของภาษาซีที่เลือกใช้ได้ เช่น C99 (ISO/IEC 9899:1999) เป็นต้น เพื่อแปลงให้เป็นไฟล์เอาต์พุต (เป็นไฟล์ประเภทที่เรียกว่า Binary Executable File)

โค้ดของโปรแกรมภาษาซี ประกอบด้วย

  • การสร้างฟังก์ชันที่มีชื่อว่า main ทุกโปรแกรมในภาษาซี จะต้องมีฟังก์ชัน main และอาจมีฟังก์ชันอื่นที่ถูกสร้างขึ้นมาเพื่อเรียกใช้งานในส่วนต่าง ๆ ของโปรแกรมสำหรับการเขียนโค้ด ภายในแต่ละฟังก์ชันประกอบด้วยประโยคคำสั่งต่าง ๆ ของภาษาซี (C Statements) ซึ่งอยู่ระหว่างวงเล็บปีกกา { ... } หนึ่งคู่ (Braces หรือ Curly Brackets) ดังนั้นจึงเป็นการรวมกลุ่มของประโยคคำสั่งที่เกี่ยวข้องไว้ด้วยกัน เรียกว่า "โค้ดบล็อก" หรือ "บล็อกของโค้ด" (Code Block หรือ Block of Code) หรือ เรียกว่า "ประโยคคำสั่งรวม" (Compound Statement) และใช้เป็นส่วนการทำงานของฟังก์ชัน (Function Body) การแบ่งประโยคคำสั่งเหล่านี้ในโค้ดบล็อก จะใช้สัญลักษณ์เซมิโคลอน (;) และทำงานไปตามลำดับ (Sequential Execution)
  • การประกาศชนิดของข้อมูลขึ้นมาใหม่เพื่อนำไปใช้กับตัวแปร
  • การประกาศใช้ตัวแปรที่อยู่ภายนอกฟังก์ชัน (เรียกว่า "ตัวแปรภายนอก") ก่อนที่จะมีการเขียนหรืออ่านข้อมูลสำหรับตัวแปรเหล่านั้นในฟังก์ชันต่าง ๆ ของโค้ด
  • การใช้คำสั่งที่เรียกว่า Preprocessor Directive เช่น #include เพื่อนำเข้าไฟล์ .h เข้ามาเป็นส่วนหนึ่งของโปรแกรมในการเขียนโค้ด
  • คำอธิบายโค้ด (Code Comments) แต่จะไม่มีผลต่อการทำงานของโปรแกรม
// This is demo code for a simple C program.

/* This preprocessor directive includes the header file that
 * declares the printf() function of the standard I/O library.
 */
#include <stdio.h> 

// Creates a function that converts Celsius to Fahernheit
float celsius_to_fahrenheit( float celsius ) {
  return ( 9 * celsius / 5  + 32 );
}

// Creates a function that converts Fahernheit to Celsius
float fahrenheit_to_celsius( float fahrenheit ) {
   return ( 5 * (fahrenheit - 32 ) / 9 );
}

// This is the main function of the program.
int main() { 
   // Declares local variables of type float
   float temp1=36.5, temp2=50, result;
   // Calls the function celsius_to_fahrenheit() 
   result = celsius_to_fahrenheit( temp1 );
   // Shows the value of temp1 in Celsius and Fahrenheit 
   printf( "%f Celsius = %f Fahrenheit\n", temp1, result );
   // Calls the function fahrenheit_to_celsius() 
   result = fahrenheit_to_celsius( temp2 );
   // Shows the value of temp2 in Fahrenheit and Celsius 
   printf( "%f Faherenheit = %f Celsius\n", temp2, result );
   // Exits the main function with a return value of 0.
   return 0;
}

จากโค้ดตัวอย่างจะเห็นได้ว่า มีส่วนต่าง ๆ ดังนี้

  • คำอธิบายโค้ดที่เริ่มต้นด้วยสัญลักษณ์ // ไปจนจบท้ายบรรทัด เป็นคำอธิบายโค้ดแบบหนึ่งบรรทัด หรือจะเขียนเป็นข้อความที่อยู่ระหว่าง /* และ */ ซึ่งมีหลายบรรทัดได้ แทรกอยู่ในส่วนต่าง ๆ ของโค้ดได้
  • การใช้คำสั่ง #include เพื่อนำเข้าไฟล์ <stdio.h> ซึ่งเป็น C Header File สำหรับไลบรารีของฟังก์ชันในกลุ่ม Standard C I/O ตามมาตรฐานของภาษาซี เช่น ฟังก์ชัน printf() สำหรับการแสดงข้อความและค่าของตัวแปร เป็นต้น
  • การใช้สัญลักษณ์ %f ในข้อความเมื่อเรียกใช้ฟังก์ชัน printf() ซึ่งหมายถึง การแทนที่สัญลักษณ์ดังกล่าวในข้อความด้วยค่าที่เป็นตัวเลขทศนิยมหรือตัวแปรที่มีชนิดข้อมูลเป็น float เช่น ค่าของตัวแปร temp1, temp2 หรือ result แต่ถ้าเป็นสัญลักษณ์ %d ก็จะใช้กับข้อมูลที่เป็นเลขจำนวนเต็มแบบ int
  • การสร้างฟังก์ชันขึ้นมาใช้งาน ได้แก่ celsius_to_fahrenheit() และ fahrenheit_to_celsius() ที่ใช้สำหรับการแปลงค่าอุณหภูมิจากหน่วยเซลเซียส ให้เป็นฟาเรนไฮต์ หรือแปลงค่าจากหน่วยฟาเรนไฮต์ให้เป็นเซลเซียส ตามลำดับ และจะเห็นว่า มีการใช้ตัวดำเนินการทางคณิตศาสตร์ เช่น การบวก (*) ลบ (-) คูณ (*) และหาร (/) เป็นต้น
  • ประโยคคำสั่งสุดท้ายในฟังก์ชัน main() เป็นคำสั่ง return 0; ซึ่งจะทำให้ฟังก์ชันจบการทำงาน และให้ค่ากลับคืน (Return Value) จากการทำงานของฟังก์ชันเป็น 0 ซึ่งมีชนิดข้อมูลเป็น int หรือ เลขจำนวนเต็ม (โดยทั่วไปค่าเป็น 0 หมายถึง จบการทำงานโดยปรกติสำหรับฟังก์ชัน main)

 


คำอธิบายโค้ด (Code Comments)#

การเขียนโค้ดด้วยภาษาคอมพิวเตอร์ นอกจากประโยคคำสั่งต่าง ๆ (Statements) ยังมีการเขียนข้อความอธิบาย หรือเรียกว่า Code Comment ซึ่งไม่มีผลต่อการทำงานของโปรแกรม แต่ช่วยให้อ่านหรือทำความเข้าใจโค้ดได้ง่ายขึ้น ข้อความที่เป็นคำอธิบายในภาษาซี จำแนกได้เป็น

  • Single-Line Comment คือ ข้อความอธิบายแบบบรรทัดเดียว ในภาษาซี หากมีสัญลักษณ์ // (Double Slash) ข้อความที่จะตามมาจนสุดบรรทัด จะถือว่า เป็นคำอธิบายโค้ด
  • Multi-Line Comment คือ ข้อความอธิบายโค้ดที่มีหนึ่งบรรทัดหรือหลายบรรทัดได้ หรือจะแทรกอยู่ในส่วนใดของโค้ดก็ได้ รูปแบบการเขียนในภาษาซีคือ เริ่มต้นและจบท้ายด้วย /* ... */

คำอธิบายโค้ดไม่มีผลต่อการทำงานของโปรแกรมภาษาซี และจะถูกตัดออกไปในขั้นตอนแรกของการคอมไพล์โค้ด โดยโปรแกรมที่เรียกว่า C Preprocessor

 


ตัวแปร (Variables)#

ตัวแปรเป็นส่วนหนึ่งที่สำคัญของการเขียนโปรแกรมคอมพิวเตอร์

  • ตัวแปรทำหน้าที่เก็บข้อมูลในหน่วยความจำของคอมพิวเตอร์ ระหว่างการทำงานของโปรแกรมภาษาซี และมีชนิดข้อมูลตามที่ประกาศไว้
  • ก่อนใช้งานในตำแหน่งถัดไปในโค้ดหรือโปรแกรม จะต้องมีการประกาศตัวแปร (Variable Declaration)
  • ประโยคคำสั่งในการประกาศตัวแปรใด ๆ จะประกอบไปด้วยการตั้งชื่อตัวแปร (Variable Name) ใช้เป็นตัวระบุด้วยชื่อ (Identifier) และเป็นชื่อที่ไม่ซ้ำกัน และมีชนิดข้อมูล (Data Type) สำหรับตัวแปรแต่ละตัว
  • เมื่อได้กำหนดชนิดข้อมูลให้ตัวแปรในโค้ดภาษาซีแล้ว จะไม่สามารถเปลี่ยนไปใช้ชนิดข้อมูลอื่นได้
  • ภาษาซีมีการจำแนกประเภทของตัวแปร ซึ่งขึ้นอยู่กับขอบเขตในการใช้งาน เช่น ตัวแปรภายในฟังก์ชัน (Local Variables) และตัวแปรภายนอก (Global Variables) เป็นต้น

ถัดไปเป็นตัวอย่างการประกาศตัวแปร เช่น ตัวแปร x, y, z มีชนิดข้อมูลแบบ int สำหรับเก็บค่าที่เป็นเลขจำนวนเต็ม (เช่น มีขนาด 32 บิต) ตัวแปร x ยังไม่มีการกำหนดค่าเริ่มต้นเมื่อประกาศตัวแปรนี้ แต่ตัวแปร y มีค่าเริ่มต้นเป็น 1; ตัวแปร z มีค่าเริ่มต้นที่ได้จากค่าของตัวแปร y คูณด้วย 2

int x;
int y = 1;
int z = 2*y;

เนื่องจากทั้งสามตัวแปร มีชนิดข้อมูลเหมือนกัน สามารถเขียนโค้ดเพื่อประกาศตัวแปรในบรรทัดเดียวได้ดังนี้

int x, y = 1, z = 2*y;

 


ตัวแปรค่าคงที่ (Constant Variables)#

หากต้องการใช้ชื่อเป็นสัญลักษณ์แทนค่าคงที่และใช้งานในการเขียนโค้ดภาษาซี ก็สามารถประกาศตัวแปร พร้อมค่าเริ่มต้น

  • "ตัวแปรค่าคงที่" คือตัวแปรที่มีการประกาศใช้งานพร้อมกับกำหนดค่าเริ่มต้นให้ด้วย เรียกว่า Initialization Value และต้องมีคำว่า const เขียนกำกับไว้ข้างหน้า
  • เมื่อได้ประกาศและกำหนดค่าให้แล้ว ตัวแปรค่าคงที่จะไม่สามารถเปลี่ยนแปลงค่าได้อีก

ตัวอย่างการประกาศตัวแปรคงที่ เช่น X_MIN และ X_MAX มีชนิดข้อมูลแบบ int และมีค่าเท่ากับ -10 และ 10 ตามลำดับ ตัวแปรค่าคงที่ X_STEPS ได้จากการคำนวณโดยนำค่าของ X_MAX มาลบด้วย X_MIN แล้วบวกด้วย 1

const int X_MIN = -10, X_MAX = 10;
const int X_STEPS = (X_MAX - X_MIN) + 1;

 


ข้อมูลค่าคงที่ (Literals)#

"ข้อมูลค่าคงที่" เป็นรูปแบบการกำหนดข้อมูลที่เป็นค่าคงที่ในโค้ดภาษาซี เช่น

  • ค่าตัวเลขที่เป็นจำนวนเต็ม (Integer) ในเลขฐานสิบ (Decimal) ฐานสอง (Binary) ฐานแปด (Octal) หรือ ฐานสิบหก (Hexadecimal) เช่น
    • -123 (เลขฐานสิบ)
    • 0b1101 (ฐานสอง) มี 0b นำหน้าตัวเลข 0 หรือ 1
    • 0755 (เลขฐานแปด) มีเลข 0 นำหน้าตัวเลขในฐานแปด (0..7)
    • 0xff หรือ 0XFF (เลขฐานสิบหก) มีสัญลักษณ์ 0x และ 0X นำหน้าตัวเลขในฐานสิบหก (0..9, A..Z หรือ a..z)
  • เลขทศนิยม (Floating-point number) เช่น
    • 1., -1.0, 123.45
    • 1.2345e+2 ซึ่งเป็นตัวเลขสัญกรณ์วิทยาศาสตร์ (Scientific Notation)
  • ตัวอักขระ (Character) เช่น
    • 'a', '1', '\n' ซึ่งมีสัญลักษณ์ ' (Single Quote) เป็นตัวเริ่มและปิดท้ายและสามารถใช้แทนตัวอักษรได้เพียงหนึ่งตัว
  • ข้อความ (String) เช่น
    • "a", "1", "Hello World!\n" ซึ่งมีสัญลักษณ์ " (Double Quote) เป็นตัวเริ่มและปิดท้ายข้อความ

 


ลำดับหลีก (Escape Sequences)#

ในภาษาซี มีการกำหนดสัญลักษณ์พิเศษ เรียกว่า Escape Sequence ซึ่งเป็นตัวอักขระ (Character) ที่มีสัญลักษณ์ ' (Single Quote) เป็นตัวเริ่มและปิดท้าย และมีสัญลักษณ์ \ (Back Slash) ตามด้วยตัวอักขระหนึ่งตัว ตามตัวอย่างดังนี้

Escape Sequence Description
\a Alert (bell, alarm)
\b Backspace
\f Form feed (new page)
\n New Line
\r Carriage Return
\t Horizontal Tab
\v Vertical Tab
\' Single Quotation Mark
\" Double Quotation Mark
\? Question mark
\ Backslash
\0 Null character (0)

 


ตัวระบุชื่อ (Identifiers)#

การตั้งชื่อสำหรับตัวระบุในภาษาซี (Identifier Name) เพื่อใช้กับตัวแปรหรือฟังก์ชัน จะต้องไม่ซ้ำกันในโค้ดของโปรแกรม และมีการจำแนกตัวพิมพ์ใหญ่และเล็ก (Case Sensitive) และต้องเป็นไปตามหลักเกณฑ์ดังนี้

  • จะต้องไม่เป็นคำสงวนในภาษาซี (C Reserved Words or Keywords)
  • ตัวแรกของตัวระบุชื่อ จะต้องเป็นตัวพิมพ์ใหญ่หรือเล็กในภาษาอังกฤษ (Letters) ซึ่งก็คือ A-Z หรือ a-z หรือ เป็นสัญลักษณ์ _ (Underscore) ก็ได้
  • ตัวถัดไปสามารถเป็นตัวพิมพ์ใหญ่หรือเล็กในภาษาอังกฤษ หรือ ตัวเลข 0 .. 9 (Digits) หรือ _
  • จะมีความยาวกี่ตัวอักษรก็ได้ แต่คอมไพเลอร์บางโปรแกรมในอดีต อาจจำกัดความยาวไว้ไม่เกิน 31 ตัวอักษร

 


คำสงวนในภาษาซี (C Reserved Words)#

คำสงวนในภาษาซี มีดังต่อไปนี้

auto      double   int       struct
break     else     long      switch
case      enum     register  typedef
char      extern   return    union
continue  for      signed    void
do        if       static    while
default   goto     sizeof    volatile
const     float    short     unsigned

 


ขอบเขตการใช้งานตัวแปร (Scope of Variables)#

การประกาศใช้งานตัวแปรในโปรแกรมภาษาซี จำแนกได้ตามขอบเขตในการมองเห็นและใช้งาน ดังนี้

  • ตัวแปรภายนอกฟังก์ชัน (Global Variables) คือ ตัวแปรที่มีการประกาศใช้นอกฟังก์ชัน อาจอยู่ในไฟล์ .c หรือ .h ใด ๆ ของซอร์สโค้ดสำหรับโปรแกรมภาษาซีได้ ตัวแปรประเภทนี้สามารถเข้าถึง (Accessible) หรือ มองเห็นได้ (Visible) ทั่วทั้งโปรแกรมภาษาซี และได้รับการจัดสรรหน่วยความจำตั้งแต่โปรแกรมเริ่มทำงานไปจนจบการทำงานของโปรแกรม
    • ถ้าประกาศใช้ตัวแปรในไฟล์ใดของซอร์สโค้ด โดยเขียนคำว่า extern ไว้ข้างหน้าประโยคคำสั่ง เช่น external int error_number; เป็นการระบุว่า ต้องใช้ตัวแปรดังกล่าวในโค้ด แต่ตัวแปรนั้นได้มีการประกาศไว้ในไฟล์อื่นแล้ว ดังนั้นจึงไม่ใช่การประกาศตัวแปรใหม่เพื่อใช้งาน
  • ตัวแปรภายในฟังก์ชันหรือภายในโค้ดบล็อก (Local Variables) จะถูกสร้างขึ้นโดยใช้หน่วยความจำของโปรแกรมที่เรียกว่า "สแตก" (Stack) เมื่อการทำงานของฟังก์ชันได้เริ่มต้นขึ้น และจะถูกทำลายไป (ไม่เก็บข้อมูลในหน่วยความจำอีกต่อไป) เมื่อจบการทำงาน หรือออกจากของโค้ดบล็อกหรือฟังก์ชันที่ได้มีการประกาศตัวแปรภายใน
  • ตัวแปรที่มีการประกาศให้เป็น static ใช้ได้กับตัวแปรภายนอกและตัวแปรภายใน และจะได้รับการจัดสรรหน่วยความจำ ตั้งแต่โปรแกรมเริ่มทำงานไปจนจบการทำงานของโปรแกรม
    • ตัวแปรภายนอกที่เป็น static จะมองเห็นได้เฉพาะในไฟล์ที่มีการประกาศใช้เท่านั้น โค้ดในไฟล์อื่นของโปรแกรม จะไม่สามารถมองเห็นตัวแปรนี้ได้
    • ตัวแปรภายในที่เป็น static จะไม่ถูกทำลายไป (ยังมีหน่วยความจำและข้อมูลในหน่วยความจำ) เมื่อจบการทำงานของโค้ดบล็อกหรือฟังก์ชันที่เกี่ยวข้อง และถ้ามีการย้อนกลับมาทำซ้ำใหม่อีกรอบ ก็สามารถใช้ข้อมูลเดิมของตัวแปรที่มีการเปลี่ยนแปลงครั้งล่าสุด

โค้ดตัวอย่าง: การประกาศใช้ตัวแปรภายนอก ภายในฟังก์ชันและในโค้ดบล็อกที่มีการใช้ชื่อตัวแปรเหมือนกันคือ x แต่มีชนิดข้อมูลต่างกัน และมีขอบเขตการใช้งานไม่เหมือนกัน

  • ตัวแปร x ตัวแรกเป็นตัวแปรภายนอก มีชนิดข้อมูลเป็น int และค่าเริ่มต้นเป็น 0 และมองเห็นหรือเข้าถึงได้ในฟังก์ชัน main
  • ภายในฟังก์ชัน main มีการประกาศใช้ตัวแปร x ตัวที่สอง มีชนิดข้อมูลเป้น char และมีค่าเริ่มต้นเป็น '1' ตัวแปร x จะเป็นตัวแปรตัวที่สอง (ไม่ใช่ตัวแปรตัวแรกอีกต่อไป) ในโค้ดถัดไปของฟังก์ชัน main
  • ตัวแปร x ตัวที่สามเกิดขึ้นเมื่อมีการประกาศตัวแปรชื่อ x ในโค้ดบล็อกซึ่งมีอยู่ในฟังก์ชัน main ของโค้ดตัวอย่าง ตัวแปรนี้มีชนิดข้อมูลเป็น float มีค่าเริ่มต้นเป็น 1.0 และมีขอบเขตในการใช้งานเฉพาะในโค้ดบล็อกดังกล่าว เมื่อจบการทำงานจากโค้ดบล็อก ตัวแปรนี้จะถูกทำลายไป
  • หากมีการใช้ตัวแปร x ในประโยคถัดไปอยู่นอกโค้ดบล็อก จะเป็นการใช้งานหรือเข้าถึงตัวแปร x ตัวที่สอง
#include <stdio.h>

int x = 0; // global variable (the first variable)

int main( ) { // the body of the main function
  printf( "1) x = %d\n", x ); // 0
  char x = '1'; // the second variable
  {  // code block
     float x = -1.0; // the third variable
     printf( "2) x = %f\n", x ); // -1.0
  }
  printf( "3) x = %c\n", x ); // '1'
  return 0;
}

ข้อความเอาต์พุตจากโปรแกรม

1) x = 0
2) x = -1.000000
3) x = 1

 


อ่านเนื้อหา: "การเขียนโปรแกรมภาษา C" (ตอนที่ 2) (ตอนที่ 3)


This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Created: 2022-09-04 | Last Updated: 2022-11-13