Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

Switch Statement ในภาษา C

ความหมาย

Switch statement ใช้เลือกทำงานหนึ่งในหลายกรณี (multiple decisions) โดยเปรียบเทียบค่าของ expression กับรายการค่าคงที่ (integer หรือ character constants)

Syntax

switch (expression) {
    case value1: stmt1; break;
    case value2: stmt2; break;
    ...
    default: stmt_x;
}

อัลกอริทึม

Step 1: ประกาศตัวแปร
Step 2: อ่านค่า expression
Step 3: switch(expression)
    ถ้า value1 -> stmt1; break;
    ถ้า value2 -> stmt2; break;
    ...
    default -> stmt_x;
Step 4: ออกจาก switch

ตัวอย่างที่ 1: แปลงตัวเลขเป็นคำอ่าน

#include <stdio.h>
int main() {
    int n;
    printf("ป้อนตัวเลข (0-1): ");
    scanf("%d", &n);
    switch (n) {
        case 0: printf("ศูนย์\\n"); break;
        case 1: printf("หนึ่ง\\n"); break;
        default: printf("เลือกไม่ถูกต้อง\\n");
    }
    return 0;
}

ผลลัพธ์

ป้อนตัวเลข (0-1): 1
หนึ่ง

ตัวอย่างที่ 2: Grade Classification

#include <stdio.h>
int main() {
    char grade;
    printf("ป้อนเกรดนักศึกษา: ");
    scanf(" %c", &grade); // space ก่อน %c เพื่อข้าม whitespace
    switch (grade) {
        case 'A': printf("เกียรตินิยม\\n"); break;
        case 'B': printf("ชั้น 1\\n"); break;
        case 'C': printf("ชั้น 2\\n"); break;
        case 'D': printf("ชั้น 3\\n"); break;
        default: printf("ไม่ผ่าน\\n");
    }
    printf("เกรดของนักศึกษา = %c\\n", grade);
    return 0;
}

ผลลัพธ์ตัวอย่าง

Run 1:
ป้อนเกรดนักศึกษา: A
เกียรตินิยม
เกรดของนักศึกษา = A
Run 2:
ป้อนเกรดนักศึกษา: C
ชั้น 2
เกรดของนักศึกษา = C

คุณสมบัติสำคัญ

  • Fall-through: หากไม่มี break จะรัน case ถัดไปต่อ (บางครั้งใช้ประโยชน์ได้)
  • Default: จับ case ที่ไม่ตรงกับ case ใดๆ (optional แต่แนะนำ)
  • Expression type: ต้องเป็น integer type (int, char, short, long, enum)
  • Case constants: ต้องเป็น compile-time constants (ไม่ใช่ variable)

Switch vs If-Else

คุณสมบัติSwitchIf-Else
เงื่อนไขEquality เท่านั้นRelational, logical ทุกอย่าง
ประสิทธิภาพJump table (O(1)) มากกว่าหลาย casesO(n) ตรวจสอบทีละเงื่อนไข
Readabilityดีสำหรับหลาย discrete valuesดีสำหรับ range/complex conditions
Type supportInteger types onlyAll types

Best Practices

  • ใช้ break ทุก case (เว้นแต่ fall-through ที่ตั้งใจ)
  • ใส่ default case เสมอ
  • จัดกลุ่ม case ที่ทำงานเหมือนกัน (multiple labels)
  • พิจารณา enum แทน magic numbers