หน่วยที่ 5 องค์ประกอบของโปรแกรมภาษาซี



     
    คำสั่งที่ใช้งานในภาษา C นั้นล้วนเป็นฟังก์ชั่นทั้งสิ้น ดังนั้นโปรแกรมที่เขียนขึ้นจึงประกอบไปด้วยฟังก์ชั่นมากมาย ที่ถูกกำหนดให้ทำหน้าที่ใดหน้าที่หนึ่งในลักษณะของโมดูลย่อย เพื่อทำงานให้บรรลุเป้าหมาย และในเมื่อภาษา C คือภาษาที่ประกอบไปด้วยฟังก์ชั่น ดังนั้นจึงจำเป็นทำความเข้าใจเกี่ยวกับความหมายของฟังก์ชั่นเสียก่อน

        ฟังก์ชั่น (Function) คือ ชุดคำสั่งที่เขียนขึ้นเพื่อสั่งให้คอมพิวเตอร์ทำงาน ที่อนุญาตให้สามารถรับข้อมูล (Input) ประมวลผล (Processes) และแสดงผลข้อมูล (Output) โดยฟังก์ชั่นที่ถูกเขียนขึ้นใช้งาน และสามารถเรียกมาใช้งานได้ทันที จะถูกจัดเก็บไว้ในไลบารีมาตรฐาน (Standard Library) ในขณะที่ฟังก์ชั่นอื่นๆจะเป็นฟังก์ชั่นที่ถูกเขียนขึ้นโดยโปรแกรมเมอร์ อย่างไรก็ตามในภาษา C จะมีฟังก์ชั่นพิเศษฟังก์ชั่นหนึ่งที่จำเป็นต้องมีไว้ในโปรแกรมเสมอ คือ ฟังก์ชั่น main() ทั้งนี้ฟังก์ชั่นดังกล่าวจัดเป็นฟังก์ชั่นหลักที่นำมาใช้เป็นจุดเริ่มต้นของโปรแกรมเพื่อสั่งให้ทำงาน โดยฟังก์ชั่นอื่นๆจะถือเป็นรูทีนย่อย (Subroutines)


โครงสร้างของโปรแกรมภาษา C สามารถแบ่งเป็นส่วนสำคัญต่างๆ ดังนี้ 
     โปรแกรมภาษาต่างๆ จะมีรูปแบบหรือโครงสร้างเฉพาะที่แตกต่างกันไป สำหรับโปรแกรมภาษาซี มีโครงสร้างและลำดับการเขียนดังนี้
  1. ส่วนประมวลผลก่อน (Preprocessor statement)
  2. ส่วนประกาศตัวแปรส่วนกลาง (Global declarations statement)
  3. ส่วนฟังก์ชันหลัก (Function main)
  4. ส่วนฟังก์ชันที่กำหนดเอง (User-defined function)
  5. ส่วนอธิบายโปรแกรม (Program Comment)

    รูปแบบ

ส่วนประมวลผลก่อน (Preprocessor statement)

          ส่วนนี้จะต้องมีทุกโปรแกรม อาจเรียกว่าส่วนหัวของโปรแกรม จำเป็นต้องกำหนดไว้ในตอนต้นโปรแกรมเสมอ โดยจะขึ้นต้นด้วยเครื่องหมาย  # ตามด้วยคำสั่งไดเร็คทีฟ (Directive) ที่ต้องการกำหนดค่า เช่น 
          #include <stdio.h> หรือ #include "stdio.h"
          หมายถึงการผนวกเฮดเดอร์ไฟล์ชื่อ stdio.h เข้ามาใช้งาน ทั้งนี้เฮดเดอร์ไฟล์ stdio.h นั้นจะเป็นไฟล์ชนิดข้อความ (Text file) ที่ภายในโปรแกรมจะมีการประกาศค่าตัวแปร และค่าคงที่ต่างๆ บรรจุฟังก์ชันมาตรฐานต่างๆ รวมเข้าด้วยกันตามหมวดหมู่เดียวกันไว้ และจัดเก็บลงในไลบรารี โดยจะถูกนำเข้ามาอ่านรวมกันกับชุดคำสั่งในโปรแกรมขณะที่คอมไพล์โปรแกรม

             stdio.h เป็นเฮดเดอร์ที่เกี่ยวข้องกับฟังชั่นอินพุตและเอาต์พุต Input and Output) เช่น 
ฟังก์ชั่น printf( ) , scanf ( )
              conio.h เป็นเฮดเดอร์ที่เกี่ยวกับฟังก์ชั่น รอรับคำสั่ง เช่น getch ( )
             ความหมายของพรีโปรเชสเชอร์ก็คือ "ตัวประมวลผลก่อน" ชึ่งจะต้องถูกกำหนดไว้นอกฟังก์ชั่นเสมอ โดยส่วนนี้จะได้รับการประมวลผลก่อนชุดคำสั่งภายในฟังชั่น จึงเป็นที่มาของพรีโปรเชสเชอร์นั่นเอง การเขียนจะต้องนำหน้าด้วยเครื่องหมาย # เสมอ อย่างไรก็ตามพรีโปรเชสเชอร์จะมีอยู่หลายตัวด้วยกัน เช่น
                 
 #if                #ifdef                #ifndef                #else                #elif                #endif

 #include      #define             #undef                 #line                #error             #pragma

ส่วนประกาศตัวแปรส่วนกลาง (Global declarations statement)

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

ส่วนฟังก์ชันหลัก (Function main)

          ส่วนนี้ทุกโปรแกรมจะต้องมี ซึ่งภายในฟังก์ชันหลักจะประกอบด้วยคำสั่งต่างๆ ที่จะให้โปรแกรมทำงาน ฟังก์ชันนี้เริ่มต้นการทำงานด้วยฟังก์ชัน main() ส่วนคำสั่งต่างๆ จะต้องเขียนอยู่ระหว่างเครื่องหมาย  { และ  เสมอ และคำสั่งทุกคำสั่งในภาษาซีจะต้องปิดท้ายด้วยเครื่องหมาย ; (semicolon) เสมอ
            ประโยคคำสั่ง (Compound Statement) เป็นชุดคำสั่งที่บรรจุอยู่ในฟังชั่นนั่นๆ ซึ่งอาจจะเป็น
             -    ประโยคที่ใช้สำหรับประกาศตัวแปร (Variable) หรือการกำหนดค่าเริ่มต้นให้กับตัวแปรต่างๆ
                 โดยตัวแปรที่ใช้งานในโปรแกรม จำเป็นต้องได้รับการประกาศชนิดข้อมูลของตัวแปรนั้นๆด้วย
             -   ประโยคนิพจน์คณิตศาสตร์ เช่น ประโยคคำนวณตัวเลขต่างๆ
             -   ประโยคคำสั่งควบคุมอื่นๆ เช่น คำสั่งควบคุมวงจรลูป คำสั่งควบคุมเงื่อนไข เป็นต้น

ส่วนฟังก์ชันที่กำหนดเอง (User-defined function)

          เป็นการเขียนคำสั่งและฟังก์ชันต่างๆ ขึ้นใช้ในโปรแกรม โดยต้องอยู่ในเครื่องหมาย { } และต้องสร้างฟังก์ชันหรือคำใหม่ที่ให้ทำงานที่เราต้องการให้กับโปรแกรมและสามารถเรียกใช้ได้ ภายในโปรแกรม

ส่วนอธิบายโปรแกรม (Program Comment)

          คอมเมนต์ (comment) คือส่วนที่เป็นหมายเหตุของโปรแกรม มีไว้เพื่อให้ผู้เขียนโปรแกรมใส่ข้อความอธิบายกำกับลงไปใน source code ซึ่งคอมไพเลอร์จะไม่ทำการแปลผลในส่วนที่เป็นคอมเมนต์นี้ 
          คอมเมนต์ในภาษาซีมี 2 แบบคือ 
  1. คอมเมนต์แบบบรรทัดเดียว ใช้เครื่องหมาย //
  2. คอมเมนต์แบบหลายบรรทัด ใช้เครื่องหมาย /* และ */


                อักขระในภาษา C (C Character Sets)
                 ภาษา C ได้เตรียมกลุ่มอักขระต่างๆ ให้ใช้งานที่เรียกว่า Character Sets โดยแบ่งออกเป็น  2  กลุ่มใหญ่ๆ คือ Basic Character set และ Execution Character set

            1. Basic Character set ประกอบด้วยกลุ่มอักขระ ดังต่อไปนี้ 
                    - อักษรตัวพิมพ์ใหญ่ (Alphabets Upper Case) ประกอบด้วยอักษร A-Z จำนวน 26 ตัว ดังนี้
                            A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
                    - อักษรตัวพิมพ์เล็ก (Alphabets Lower Case) ประกอบด้วยอักษร a-z จำนวน 26 ตัว ดังนี้
                            a b c d e f g h i j k l m n o p q r s t u v w x y z
                    - ตัวเลข (Decimal Digits) ประกอบไปด้วยตัวเลข 0 - 9 จำนวน 10 ตัว ดังนี้
                            0 1 2 3 4 5 6 7 8 9
                    - ตัวอักขระแบบกราฟิก ประกอบด้วยสัญลักษณ์ต่างๆ จำนวน 29 ตัว ดังนี้
                            ,    (comma)                               (    (left parenthesis)                           
                         ;    (semicolon)                            )    (right parenthesis)
                            .    (period)                                  [    (left bracket)
                            ?   (question mark)                     ]    (right bracket)
                            !    (exclamation)                        {    (left brace)
                            :    (colon)                                   }    (right brace)
                            +   (plus)                                     <   (less than)
                            -    (minus)                                  >   (greater than)
                            *    (asterisk)                               =   (equal sign)
                            /    (slash)                                   &   (ampersand)
                            \    (backslash)                            %  (percent sign)

                           |    (vertical bar)                          #   (number sign)
                            '    (single quote)                         ^   (caret)
                            "   (double quote)                        _   (under score)
                            ~    (tild)                                       

                    -ตัวอักขระแบบช่องว่าง (White space Character ประกอบด้วยอักขระที่เป็นช่องว่างในลักษณะต่างๆ จำนวน 5 ตัว ดังนี้
                                blank space, horizontal tab, vertical tab, newline, form feed

            2. Execution Character set  ประกอบด้วยกลุ่มอักขระ ดังต่อไปนี้
                 -อักขระที่เป็นค่าว่าง (Null Character) อักขระที่เป็นค่าว่าง หรือค่า Null จะใช้สัญลักษณ์ \0
                -อักขระควบคุม (Escape Sequence)เป็นรหัสที่ใช้ควบคุมการแสดงผลทางจอภาพและเครื่องพิมพ์ประกอบด้วย :
                 \a        alert (bell)                    \\        backslash
                 \b        backspace                   \?       backslash
                 \f         form feed                     \'        single quote
                 \n        new line                       \"        double quote
                 \r        carriage return             \ooo   octal number
                \t        horizontal ta                 \xhh    hexadecimal number
                \v        vertical tab   


กฎเกณฑ์การเขียนภาษาซี

 กฎเกณฑ์ในการเขียนภาษา C ที่ควรคำนึง มีดังนี้
            1. จะต้องกำหนดพรีโปรเชสเชอร์ที่ต้นโปรแกรมก่อน เช่น #include<stdio.h>, #include<conio.h>
            2. คำสั่งต่างๆจะใช้อักษรพิมพ์เล็ก
            3. ตัวแปรที่ใช้งานในโปรแกรมต้องประกาศไว้เสมอ
            4. ภายในโปรแกรมต้องมีอย่างน้อยหนึ่งฟังก์ชั่น คือ main ( )
            5. ใช้เครื่องหมาย { เพื่อบอกจุดเริ่มต้นของชุดคำสั่ง และเครื่องหมาย } เพื่อบอกจุดสิ้นสุดของชุดคำสั่ง
                โดยสามารถซ้อนเครื่องหมาย { } เพิ่มไว้ภายในได้
            6. สิ้นสุดของแต่ละประโยคคำสั่ง จะต้องจบด้วยเครื่องหมาย ; (semicolon)
            7. สามารถใช้เครื่องหมาย /*comment*/ หรือ //comment เพื่อระบุหมายเหตุภายในโปรแกรม โดยคำ
                 อธิบายที่อยู่ภายใต้เครื่องหมาย /*
comment*/ หรือ //comment จะไม่ถูกนำไปประมวลผล

              ตัวแปลภาษา (Translator)
                  เนื่องจากภาษาคอมพิวเตอร์โดยเฉพาะภาษารับสูง จะมีจุดประสงค์เพื่อให้มนุษย์สามารถสื่อสารเพื่อ                การเขียนโปรแกรมได้ง่ายขึ้น แต่ภาษาระดับสูงเป็นภาษาที่คอมพิวเตอร์ไม่รู้จัก ดังนั้นจึงต้องนำ
             ภาษาระดับสูงผ่านกระบวนการแปลเพื่อให้เป็นภาาาเครื่องเสียก่อน ตัวแปลภาษาแบ่งออกเป็น 2 ชนิด คือ

                1. อินเตอร์พรีเตอร์ (Interpreter)
                  ตัวแปลภาษาชนิดอินเตอร์พรีเตอร์ จะทำการแปลคำสั่งที่ละคำสั่ง และจะปฏิบัติตามในคำสั่งนั้นๆ
              หากไม่พบข้อผิดพลาดใดๆ จากนั้นก็จะนำคำสั่งต่อไปมาแปลต่อ จะกระทำเช่นนี้ไปเรื่อยๆจนจบ ถ้ามี
              ข้อผิดพลาดในโปรแกรม เครื่องก็จะหยุดแล้วรายงานให้ทราบทันทีทางจอภาพ

                2. คอมไพลเลอร์ Compiler)
                    การแปลของคอมไพล์จะแปลทั้งโปรแกรมที่เดียว นั่นคือซอร์สโค้ดทั้งโปรแกรมจะถูกนำมาแปล
              เพียงครั้งเดียว ถ้าเจอข้อผิดพลาดก็จะรายงานให้ทราบเพียงครั้งเดียวโดยไม่บอกตำแหน่งของการ
              ผิดพลาด








 |ตัวดำเนินการและนิพจน์ |
          ในการเขียนโปรแกรมตวดำเนินการจะเป็นตัวทำหน้าที่รวมค่าต่างๆ และกระทำกับค่าต่างๆ ให้เป็นค่าเดียวกัน อย่างเช่นโปรแกรมในบทที่ผ่านมามีการนำข้อมูลที่เป็นตัวแปรมาคูณกับค่าคงที่ ซึ่งจะต้องใช้ตัวดำเนินการทางคณิตศาสตร์เพื่อทำการคูณ ตัวดำเนินการมีหลายประเภทดังต่อไปนี้
  1. ตัวดำเนินการเลขคณิต
  2. ตัวดำเนินการเปรียบเทียบ
  3. ตัวดำเนินการทางตรรกะ
  4. ตัวดำเนินการแบบบิต
  5. ตัวดำเนินการกำหนดค่าเชิงประกอบ
  6. ตัวดำเนินการเพิ่มค่าและลดค่า

1.  ตัวดำเนินการเลขคณิต

           ใช้สำหรับกระทำการคำนวณทางคณิตศาสตร์ เช่น บวก ลบ คูณ หาร โดยจะนำข้อมูลตัวหนึ่งไปกระทำกับอีกตัวหนึ่ง โดยใช้ผลลัพธ์เป็นตัวเลขทางคณิตศาสตร์ ตัวดำเนินการทางคณิตศาสตร์ แบ่งออกได้ดังต่อไปนี้
          จากตัวอย่าง 3.4.2 คำสั่ง sum / 3 ควรจะให้ผลลัพธ์เป็นจำนวนเต็ม 8 เนื่องจากตัวถูกดำเนินการทั้งสองตัวมีชนิดเป็นจำนวนเต็ม แต่ในที่นี้เราได้แปลงชนิดข้อมูลของตัวแปร sum แบบชั่วคราว จากจำนวนเต็มให้เป็นจำนวนจริง โดยใช้ (float) ทำให้ sum / 3 ในบรรทัดที่ 13 ให้ผลลัพธ์เป็นจำนวนจริงก่อนนำไปกำหนดให้เป็นค่าของตัวแปร average

2.  ตัวดำเนินการเปรียบเทียบ

           ตัวดำเนินการเปรียบเทียบ (Relation Operators) จะนำข้อมูลสองค่ามาเปรียบเทียบกัน โดยข้อมูลทั้งสองค่าจะต้องเป็นข้อมูลประเภทเดียวกัน ผลลัพธ์ที่ได้จะเป็นค่าทางลอจิก คือ จริงหรือเท็จ


3.  ตัวดำเนินการทางตรรกะ

           ตัวดำเนินการทางตรรกะ (Logical Operator) ประกอบด้วย การทำ  AND(และ) , OR(หรือ) และ NOT(นิเสธ) เมื่อกระทำกับค่าใด ผลลัพธ์ที่ออกมาจะเป็นจริงหรือเท็จ ตัวดำเนินการทางตรรกะแสดงได้ ดังตารางต่อไปนี้

ตารางที่ 3.4.3 ตารางแสดงตัวดำเนินการทางตรรกะ


          จากตารางค่าความจริงของนิพจน์ตรรกะ เมื่อ 0 แทนค่าเท็จ และ 1 แทนค่าจริง แสดงดังตาราง
  • p && q จะมีค่าจริง เมื่อ p และ q มีค่าจริงทั้งคู่ มิฉะนั้นจะมีค่าเป็นเท็จ
  • p || q จะมีค่าจริง เมื่อ p และ q มีค่าเท็จทั้งคู่ มิฉะนั้นจะมีค่าเป็นจริง
  • !p จะมีค่าจริง เมื่อ p มีค่าเท็จ และ !p จะมีค่าเท็จ เมื่อ p มีค่าจริง

4.  ตัวดำเนินการแบบบิต

           จะนำข้อมูลสองค่ามาเปรียบเทียบกัน โดยข้อมูลทั้งสองค่าจะต้องเป็นข้อมูลประเภทเดียวกัน ผลลัพธ์ที่ได้จะเป็นค่าทางลอจิก คือ จริงหรือเท็จ

5.  ตัวดำเนินการกำหนดค่าเชิงประกอบ
           การใช้ตัวดำเนินการบางประเภทสามารถนำมารวมกันเป็น ตัวดำเนินการกำหนดค่าเชิงประกอบ (Compound Assisgnment) ได้ มีรูปแบบคือ

6.  ตัวดำเนินการเพิ่มค่าและลดค่า

          ตัวดำเนินการเพิ่มค่า (Increment Operator) ใช้เครื่องหมาย ++
          ตัวดำเนินการลดค่า (Decrement Operator) ใช้เครื่องหมาย --
          โดยการเพิ่มค่า หรือการลดค่าด้วยตัวดำเนินการดังกล่าว จะเพิ่มทีละหนึ่ง หรือลดทีละหนึ่ง และจะต้องใช้กับตัวแปรโดดๆ โดยสามารถใช้เครื่องหมาย ++ และ -- เขียนนำหน้าตัวแปร (Prefix) หรือหลังตัวแปร (Postfix) ก็ได้ เช่น ++i หรือ i++ แต่ทั้งสองแบบนี้จะมีวิธีการจัดการกับค่าที่แตกต่างกัน ดังตาราง

นิพจน์

          นิพจน์ (Expression) ในภาษาซีนี้ ประกอบด้วย ค่าคงตัว ค่าคงที่ หรือตัวแปร 1 จำนวน หรือกลุ่มของค่าคงตัว ค่าคงที่ หรือตัวแปรพร้อมด้วยตัวดำเนินการของภาษาซี ตัวดำเนินการที่ใช้ในนิพจน์ที่กล่าวถึงได้แก่ ตัวดำเนินการกำหนดค่า ตัวดำเนินการคำนวณ และตัวดำเนินการบอกตำแหน่งบนหน่วยความจำ
ans = 100 - 50 
score = midterm + final +quiz 
income = salary + (ot * RATE) + bonus - tax
           จากนิพจน์คณิตศาสตร์ข้างต้น พบว่า ans, score และ income เป็นตัวแปรที่ใช้เก็บผลลัพธ์จากการคำนวณ ส่วนนิพจน์ด้านขวาจะเป็นนิพจน์แบบหลายตัวแปร ซึ่งสามารถมีได้ทั้งตัวแปร และค่าคงที่ รวมถึงตัวดำเนินการคณิตศาสตร์ เช่น + - * / เป็นต้น ซึ่งในการสร้างสูตรคำนวณค่าตัวเลข ซึ่งเป็นสูตรที่มีความซับซ้อน จะต้องระมัดระวังในการจัดลำดับนิพจน์ เพื่อให้คอมพิวเตอร์ประมวลผลได้อย่างถูกต้อง ทั้งนี้ตัวดำเนินการต่างๆ ที่นำมาใช้เพื่อการคำนวณนั้น แต่ละตัวจะมีลำดับความสำคัญที่แตกต่างกัน เช่น เมื่อพบเครื่องหมาย + และ * การประมวลผลจะกระทำที่ตัวดำเนินการ * ก่อน เพราะจะมีลำดับความสำคัญสูงกว่า + นั่นเอง

ตัวดำเนินการกับลำดับความสำคัญ

           ตัวดำเนินการแต่ละตัวจะมีลำดับความสำคัญก่อนหลังที่แตกต่างกัน โดยการประมวลผลจะกระทำกับตัวดำเนินการที่มีลำดับควาสำคัญสูงก่อน แต่ถ้ากรณีที่มีลำดับความสำคัญเท่ากัน ตามปกติจะกระทำกับตัวดำเนินการจากซ้ายไปขวา 

ตารางที่ 3.4.7 ตารางแสดงตัวดำเนินการกับลำดับความสำคัญ
 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)

ลำดับความสำคัญของตัวดำเนินการ (Operator of Precedence)
        ในการเขียนโปรแกรมเพื่อใช้งาน จำเป็นต้องเกี่ยวข้องกับนิพจน์คณิตศาสตร์ และสูตรคำนวณต่างๆไม่มากก็น้อย  และสิ่งต่างๆเหล่านี้จำเป็นต้องใช้ตัวดำเนินการ เข้าไปประกอบใช้งาน และตัวดำเนินการแต่ละตัวต่างก็มีลำดับความสำคัญของการทำงานก่อนหลังแตกต่างกันไป ดังนั้น จึงจำเป็นต้องศึกษาถึงลำดับการทำงานของตัวดำเนินการ ดังนี้

 ที่   ตัวดำเนินการความหมาย  ลำดับการคำนวณ
 1(  )
[  ]
.
->
Parenthesized expression
Array subscript
Member selection by object
Member selection by pointer
ซ้ายไปขวา 
 2+  -
++ --
!  ~
&
sizeof
(type)
U nary + and -
Prefix increment and prefix decrements
Logical NOT and bit wise complement
Address-of
Size of expression or type
Explicit cast to type such as (int) or (double)
ขวาไปซ้าย
3 *  /  %Multiplication and division and modulus ซ้ายไปขวา
4+  - Addition and Subtraction ซ้ายไปขวา 
5<<  >> Bit wise shift left and bit wise shift right ซ้ายไปขวา
6<  <=
>  >=
Less than and less than or equal to
Greater than and greater than or equal to
ซ้ายไปขวา 
 7 ==  !=Equal to and not equal to ซ้ายไปขวา 
 8 &Bit wise AND ซ้ายไปขวา 
 9 ^Bit wise Exclusive OR ซ้ายไปขวา  
10 |Bit wise OR ซ้ายไปขวา  
11 &&Logical AND ซ้ายไปขวา  
12|| Logical OR ซ้ายไปขวา  
13?: Conditional operator ขวาไปซ้าย
14 =
+=  -=
*=  /=
%=
<<=  >>=
&=  |=
^=
Assignment
addition assignment and subtraction assignment
Multiplication assignment and division assignment
Modulus assignment
Bit wise shift left assignment and bit wise shift right assignment
Bit wise AND assignment and bit wise OR assignment
Bit wise Exclusive OR assignment
ขวาไปซ้าย 
15Comma operator ซ้ายไปขวา 

|ตัวแปร (Variable)|
            ตัวแปร (Variable) คือ การจองพื้นที่ในหน่วยความจำของคอมพิวเตอร์สำหรับเก็บข้อมูล ที่ต้องใช้ในการ ทำงานของโปรแกรม โดยมีการตั้งชื่อเรียกหน่วยความจำในตำแหน่งนั้นด้วย เพื่อความสะดวกในการเรียกใช้ข้อมูล ถ้าจะใช้ข้อมูลใดก็ให้เรียกผ่านชื่อของตัวแปรที่เก็บเอาไว้
         การตั้งชื่อให้กับตัวแปรจะเป็นไปตามหลักการตั้งชื่อของภาษาซี และชื่อที่เหมาะสมควรจะเป็นชื่อที่สื่อความหมาย การประกาศตัวแปรมีรูปแบบ ดังนี้

           กฎการตั้งชื่อตัวแปร (Variable Names)   การตั้งชื่อตัวแปรและค่าคงที่ จำเป็นต้องคำนึงถึงกฎเกณฑ์ต่างๆ ดังนี้ คือ            
         1. ต้องขึ้นต้นด้วยตัวอักษร A-Z หรือ a-z หรือเครื่องหมาย _(Underscore) เท่านั้น            
         2. ภายในชื่อตัวแปรสามารถใช้ตัวอักษร A-Z หรือ a-z หรือตัวเลข 0-9 หรือเครื่องหมาย _  (Underscore)           
         3. ภายในชื่อห้ามเว้นช่องว่าง หรือใช้สัญลักษณ์นอกเหนือจากข้อ 2            
         4. ตัวอักษรพิมพ์เล็กหรือใหญ่มีความหมายแตกต่างกัน            
         5. ห้ามตั้งชื่อซ้ำกับคำสงวน (Reserved Word) ดังนี้

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

                ตัวอย่างการตั้งชื่อตัวแปร
                    การตั้งชื่อตัวแปรที่ผิด :
                        a                    month            MONTH        _var1
                        sarary            stdCode        num1                day_of_week

                    การตั้งชื่อตัวแปรที่ผิด :
                        586_cpu        emp no            do                tatal$
                        *point            sub-total           num1,2        @email
            
เกณฑ์พิจารณาถูกหรือผิดเพิ่มเติมจากตัวอย่างชื่อตัวแปร


                ชนิดข้อมูลและขนาด (Data Type and Sizes)
                ตัวแปรที่ประกาศใช้งานในโปรแกรม จำเป็นต้องถูกระบุชนิดข้อมูลเพื่อให้ทราบว่าตัวแปรเหล่านั้น
            จัดเก็บข้อมูลชนิดใดลงไป สำหรับในภาษา C จะมีข้อมูลพื้นฐานไม่กี่ชนิด คือ
 charข้อมูลชนิดตัวอักษร (Character) 
 intข้อมูลชนิดเลขจำนวนเต็ม (integer) 
 floatข้อมูลชนิดตัวเลขจำนวนจริง(ทศนิยม) (read or floating point)
 doubleข้อมูลชนิดเลขจำนวนจริง 2 เท่า (double precision float)

                และยังสามารถปรับรุงด้วยการเพิ่มเครื่องหมายนำหน้าได้อีก  ซึ่งประกอบด้วย
signed        unsigned        long        short 

 แสดงชนิดข้อมูลพื้นฐานในภาษาซี  

               
     ชนิดข้อมูลพื้นฐานในภาษาซีเป็นข้อมูลชนิดสเกลาร์ โดยที่ตัวแปรที่มีชนิดสเกลาร์ในขณะใดขณะหนึ่งจะเก็บข้อมูลได้เพียงค่าเดียวเท่านั้น ข้อมูลชนิดสเกลาร์แบ่งออกเป็น 
  1. ข้อมูลชนิดตัวเลข (arithmetic data type) ซึ่งประกอบด้วย ข้อมูลชนิดจำนวนเต็ม และข้อมูลชนิดจำนวนจริง
  2. ข้อมูลชนิดตัวชี้ (pointer data type)
  3. ข้อมูลชนิดแจงนับ (enumerated data type)
         ในเอกสารนี้จะกล่าวถึงเฉพาะการใช้งานข้อมูลชนิดจำนวนเต็มและข้อมูลชนิดจำนวนจริงเท่านั้น

ข้อมูลชนิดจำนวนเต็ม

           บรรทัดที่ 4 ตัวแปร age ถูกประกาศให้มีชนิดจำนวนเต็ม และถูกกำหนดให้มีค่าเป็น 15 ในบรรทัดที่ 5 
           บรรทัดที่ 6 ค่าตัวแปร age ซึ่งเป็นอาร์กิวเมนต์ที่สองของคำสั่ง printf() จะถูกจัดรูปแบบให้อยู่ในรูปของจำนวนเต็มฐานสิบก่อนแสดงผล
           สังเกตว่าอาร์กิวเมนต์แรกของคำสั่ง printf() จะต้องมีชนิดเป็นสายอักขระเสมอ และคำสั่ง printf() จะมีจำนวนอาร์กิวเมนต์นอกเหนือจากอาร์กิวเมนต์แรกอีกเท่าใดขึ้นอยู่กับจำนวนชุดอักขระจัดรูปแบบในอาร์กิวเมนต์แรก โดยที่อาร์กิวเมนต์ในลำดับถัดไปอาจอยู่ในรูปของค่าคงตัว นิพจน์ หรือตัวแปรก็ได้
          บรรทัดที่ 4 เป็นการประกาศให้ x1 และ y1 เป็นตัวแปรชนิดจำนวนเต็มทั้งสองตัว และบรรทัดที่ 5 เป็นการประกาศให้ x2 และ y2 เป็นตัวแปรชนิดจำนวนเต็ม พร้อมกับกำหนดให่มีค่าเริ่มต้นเป็น 5 และ 0 ตามลำดับ
           อาร์กิวเมนต์แรกของคำสั่ง printf() ในบรรทัดที่ 8 เป็นสายอักขระที่ประกอบด้วยชุดอักขระจัดรูปแบบ %d จำนวน 2 ชุด โดย %d แรกใช้จัดรูปแบบการแสดงผลค่าของตัวแปร x1 และ %d ที่สองใช้จัดรูปแบบการแสดงผลค่าของตัวแปร y1
           นอกจากชุดอักขระจัดรูปแบบ %d แล้วยังมีชุดอักขระจัดรูปแบบสำหรับจำนวนเต็มในฐานอื่นอีก คือ %o และ %x ซึ่งเป็นชุดอักขระที่ใช้จัดรูปแบบข้อมูลให้อยู่ในรูปจำนวนเต็มฐานแปด (octal) และจำนวนเต็มฐานสิบหก (hexadecimal) ตามลำดับ ดังแสดงในตัวอย่างที่ 3.2.3
     

ข้อมูลชนิดจำนวนจริง

           ชนิดข้อมูลจำนวนจริงในภาษาซีประกอบด้วย float double และ long double โดยชนิด float จะมีจำนวนตำแหน่งทศนิยมน้อยกว่าชนิด double และชนิด long double ตามลำดับ
           ชุดอักขระจัดรูปแบบที่ใช้สำหรับข้อมูลชนิดจำนวนจริงในคำสั่ง printf() ประกอบด้วย %f ใช้เพื่อจัดรูปแบบข้อมูลชนิด float ให้อยู่ในรูปแบบจำนวนจริงฐานสิบ %e และ %E ใช้เพื่อจัดรูปแบบข้อมูลให้อยู่ในรูปของสัญลักษณ์เชิงวิทยาศาสตรสำหรับข้อมูลชนิด double และ long double จะใช้อักขระ lf และ Lf เป็นอักขระที่เพิ่มเข้าไปใช้ชุดอักขระจัดรูปแบบ ตามลำดับ
           การแสดงผลข้อมูลชนิดจำนวนจริงในคำสั่ง printf() โดยใช้ %f %e หรือ %E จะแสดงค่าทศนิยม 6 ตำแหน่ง อย่างไรก็ตามในชุออักขระจัดรูปแบบจำนวนจริง ยังสามารถกำหนดจำนวนตำแหน่งในการแสดงผลข้อมูลให้กับข้อมูลแต่ละจำนวน เพื่อจัดรูปแบบผลลัพธ์ให้สวยงาม ดังแสดงในตัวอย่างที่ 3.2.5



 ค่าคงที่ หมายถึง ข้อมูลที่ระบุเป็นค่าอย่างใดอย่างหนึ่งในโปรแกรม และมีชนิดของข้อมูลตามค่าของข้อมูลนั้น เช่น


            บรรทัดที่ 2 และ 3 เป็นการเรียกใช้คำสั่งของตัวประมวลผลก่อนซี #define ซึ่งใช้สำหรับกำหนดให้ FACTOR และ FBASE มีค่าคงที่ที่มีค่าเป็น 5/9 และ 32 ตามลำดับ ในขั้นตอนการประมวลผลก่อน (preprocessing) ค่าคงที่ทั้งหมดจะถูกแทนที่ด้วยค่าที่กำหนดให้
           บรรทัดที่ 7 ค่า 78.5 เป็นค่าคงที่ชนิดจำนวนจริงที่กำหนดให้เป็นค่าของตัวแปร degF บรรทัดที่ 11 เราสามารถกำหนดให้ตัวแปร degF มีค่าเป็น 100.00 และเรียกใช้ค่าคงที่ FACTOR และ FBASE คำนวณอีกครั้งในบรรทัดที่ 12
           การใช้ค่าคงที่ในโปรแกรมอย่างเหมาะสม จะช่วยให้สามารถเข้าใจความหมายของโปรแกรมได้ดียิ่งขึ้น และยังช่วยให้การปรับปรุงโปรแกรมทำได้โดยง่าย


            การกำหนดค่าให้กับตัวแปร (Presetting Variable Values)
        การกำหรดค่าให้กับตัวแปร จะต้องกำหนดให้เป็นไปตามกฎ และต้องสัมพันธ์กับชนิดข้อมูลที่ประกาศไว้เป็นสำคัญ เช่น หากกำหนดตัวแปรเป็นชนิดข้อมูล int ค่าที่กำหนดให้กับตัวแปรก็จะต้องเป็นเลขจำนวนเต็มเท่านั้น ไม่สามารถกำหนดเป็นเลขทศนิยาหรือข้อความได้


            การกำหนดค่าชนิดเลขจำนวนเต็ม
                1. ค่าตัวเลขจะต้องไม่มีทศนิยม
                2. สามารถเป็นได้ทั้งค่าบวก และค่าลบ
                3. สำหรับค่าบวกไม่จำเป็นต้องใส่เครื่องหมาย
                4. ห้ามใช้เครื่องหมายคอมม่า ,หรือช่องว่างกำกับระหว่างตัวเลข เช่น 14,560 ซึ่งถือว่าผิด
                5. ช่วงค่าตัวเลจจำนวนเต็ม จะอยู่ระหว่าง -2,147,483,647 ถึง 2,147,483,647
                6. สามารถใช้ Suffix ต่อท้ายค่าได้ เช่น เลขจำนวนเต็มแบบยาว ก็จะใช้อักษร L (ตัวพิมพ์เล็กหรือใหญ่ก็ได้)ต่อท้ายค่า ส่วนค่าที่เป็น unsign ก็จะใช้อักษร U ต่อท้าย และใช้ UL ต่อท้ายค่าที่เป็น unsigned long

                ตัวอย่าง :        n1 = 445;  //int
                                      n2 = +557;
                                      n3 = -6687;
                                      n4 = 123456789L; //long int
                                      n5 = 1234U;  //unsigned int
                                      n6 = 123456789UL;  //unsigned long int

            การกำหนดค่าชนิดเลขจำนวนจริง
                1.ค่าตัวเลขสามารถมีจุดทศนิยมได้
                2.สามารถเป็นได้ทั้งค่าบวก และลบ
                3.ค่าบวกไม่จำเป็นต้องใส่เครื่องหมาย + นำหน้า
                4.สามารถกำหนดค่าแบบเอ็กซ์โปแนนต์ได้  ด้วยการใช้อักษร E  ต่อท้ายค่า
                5.ค่าที่ถูกกำหนอเป็นค่าเอ็กซ์โปรเนนต์ สามารถเป็นได้ทั้งค่าบวกและลบ
                6.ช่วงของค่าตัวเลขชนิดจำนวนจริงเป็นไปตามชนิดข้อมูล ซึ่งอาจถูกกำหนดเป็น float, double
                    หรือ long double
                7.สำหรับค่าจำนวนจริงชนิด double จะใช้ F ต่อท้ายค่า และใช้ L ต่อท้ายค่าที่กำหนดชนิดข้อมูล
                   เป็น long double

                ตัวอย่าง :        n1    =    40.9;    //float
                                      n2    =    +3.2E-5;    //float exponent
                                      n3    =    4.3E8;
                                      n4    =    -0.2E+3
                                      n5    =    12.35F    //double
                                      n6    =    12.34L;    //long double

            การกำหนดค่าชนิดตัวอักษร
                1.ค่าที่กำหนดจะต้องอักขระเพียงค่าเดียว และจะต้องอยู่ภายในเครื่องหมาย '  ' ไม่ใช่เครื่องหมาย "  " ดังนั้นจึงต้องพึงระมัดระวังเป็นพิเศษด้วย
                2.ขนาดจำนวนตัวอักษรในภาษา C จะมองเป็น ASCII ที่ใช้แทนตัวอักขระต่างๆ เช่น ค่า 'A' จะมีค่าเท่ากับ 65 หรือค่า 'a' จะมีค่าเป็น 97
       
           ตัวแปรสำหรับข้อความ

       ในภาษา C ไม่มีการกำหนดชนิดของตัวแปรสำหรับข้อความโดยตรง แต่จะใช้การกำหนดชนิดของตัวแปรอักขระ (char) ร่วมกับการกำหนดขนาดแทน และจะเรียกตัวแปรสำหรับเก็บข้อความว่า ตัวแปรสตริง (string) รูปแบบการประกาศตัวแปร
สตริงแสดงได้ดังนี้ 
 char name[n] = "str";  
        name        ชิ่อของตัวแปร
        n               ขนาดของข้อความ หรือจำนวนอักขระในข้อความ
        str             ข้อความเริ่มต้นที่จะกำหนดให้กับตัวแปรซึ่งต้องเขียนไว้ภายใต้เครื่องหมาย " "     
ตัวอย่างการประกาศตัวแปรสำหรับเก็บข้อความ แสดงได้ดังนี้

char name[5] = "kwan" ;
สร้างตัวแปร name สำหรับเก็บ ข้อความ kwan ซึ่งมี 4 ตัวอักษร ดังนั้น name ต้องมีขนาด 5
char year[5] = "2549";สร้างตัวแปร year สำหรับเก็บ ข้อความ 2549 ซึ่งมี 4 ตัวอักษร ดังนั้น year ต้องมีขนาด 5
char product_id[4] = "A01";สร้างตัวแปร product_id สำหรับเก็บ ข้อความ A01 ซึ่งมี 3 ตัวอักษร ดังนั้น product_id ต้องมีขนาด 4 
            
              การประกาศตัวแปร (Declarations)
                ตัวแปรทุกตัวจำเป็นจะต้องประกาศก่อนใช้งานเสมอ แต่อย่างไรก็ตามภาษา C ก็ยังสามารถประกาศตัวแปรได้หลายรูปแบบ ซึ่งประกอบด้วย
                1.การประกาศตัวแปรที่ละตัว ที่ละบรรทัด เช่น
                        int lower;
                        int upper;
                        int step;
                        char c;
                        char line[1000];
                2.การประกาศกลุ่มตัวแปรพร้อมกัน
                    เป็นการประกาศตัวแปรที่มีชนิดข้อมูลเหมือนกันภายในบรรทัดเดียวกัน (Multiple Declaration)โดยใช้เครื่องหมายคอมม่า , คั่นระหว่างชื่อตัวแปรแต่ละตัว เช่น
                    int    lower, upper, step;
                3.การกำหนดตัวแปรพร้อมกำหนดค่าเริ่มต้น เช่น
                    char esc='\\';
                    int i=0;
                4.ประกาศตัวแปรชนิดค่าคงที่
                    const    double e=3.14;
                    const    char msg[ ]= "warning...."


|รหัสรูปแบบและรหัสควบคุม|