← Lập trình C cơ bản

Bài 9 · Vận dụng · 20 phút· Cập nhật 11/06/2026

Rẽ nhánh: if/else & switch

Biên soạn bởi Nguyễn Anh Tuấn

Viết if/else-if/else và switch/case; hiểu thứ tự xét nhánh, break/default, fall-through và khi nào dùng mỗi dạng rẽ nhánh.

if chạy một khối lệnh khi điều kiện đúng; phần else chạy khi điều kiện sai. Điều kiện đặt trong ngoặc (…):

if.c

#include <stdio.h>

int main() {
    int tuoi = 20;
    if (tuoi >= 18) {
        printf("Du tuoi bau cu\n");
    } else {
        printf("Chua du tuoi\n");
    }
    return 0;
}

Kết quả khi chạy

Du tuoi bau cu
  • if (điều_kiện) { … } chạy khối khi điều kiện ĐÚNG.
  • else { … } chạy khi điều kiện SAI (tuỳ chọn).
  • Điều kiện đúng = khác 0 (xem Bài Toán tử & biểu thức).

Nối nhiều điều kiện bằng else if. Chúng được kiểm tra lần lượt từ trên xuống; nhánh đúng ĐẦU TIÊN chạy, các nhánh sau bị bỏ qua. Kéo thử điểm để xem nhánh nào chạy:

if (diem >= 9) → loai = 'A' - Giỏi
else if (diem >= 7) → loai = 'B' - Khá ◀ chạy nhánh này
else if (diem >= 5) → loai = 'C' - Trung bình
else → loai = 'D' - Yếu

Với điểm 7.5 → kết quả loai = 'B' - Khá.

Các điều kiện được kiểm tra lần lượt từ trên xuống; nhánh ĐÚNG đầu tiên chạy, các nhánh sau bị bỏ qua - vì vậy thứ tự rất quan trọng.

xep-loai.c

#include <stdio.h>

int main() {
    float diem = 7.5;
    if (diem >= 9)      printf("Gioi\n");
    else if (diem >= 7) printf("Kha\n");
    else if (diem >= 5) printf("Trung binh\n");
    else                printf("Yeu\n");
    return 0;
}

Kết quả khi chạy

Kha

Thứ trong ngoặc của if chính là một biểu thức (Bài Toán tử): cho kết quả khác 0 thì “đúng”. Ghép nhiều điều kiện bằng && (và), || (hoặc):

  • Khoảng: if (tuoi >= 13 && tuoi <= 19) - “tuổi teen”.
  • Hoặc: if (ngay == 7 || ngay == 1) - cuối tuần.
  • Nhớ dùng == để so sánh bằng (không phải =).

Khi cần so một giá trị với nhiều khả năng rời rạc, switch gọn hơn chuỗi else if. Mỗi case là một khả năng; nhớ break để dừng, và default cho trường hợp còn lại:

switch.c

#include <stdio.h>

int main() {
    int thu = 3;
    switch (thu) {
        case 2: printf("Thu hai\n"); break;
        case 3: printf("Thu ba\n");  break;
        case 4: printf("Thu tu\n");  break;
        default: printf("Ngay khac\n");
    }
    return 0;
}

Kết quả khi chạy

Thu ba

Hai lỗi rẽ nhánh phổ biến nhất. Thứ nhất - quên break trong switch khiến nó “rơi xuống” chạy luôn các case sau:

quen-break.c

int x = 1;
switch (x) {
    case 1: printf("mot\n");   // KHONG co break ->
    case 2: printf("hai\n");   // chay luon xuong day
    default: printf("khac\n");
}

Kết quả khi chạy

mot
hai
khac

Lỗi thứ hai: “=” thay vì “==”

if (diem = 10) là GÁN (luôn “đúng”), không phải so sánh. Dùng if (diem == 10). Và nên luôn bọc thân if bằng { } để tránh lỗi khi thêm dòng.

Bài tiếp theo

Chương trình biết ra quyết định rồi - bài kế, Vòng lặp: for, while, do-while, cho nó sức lặp lại công việc hàng nghìn lần.

Câu hỏi thường gặp

if mở đầu chuỗi điều kiện. Mỗi else if CHỈ được kiểm tra khi tất cả if/else if phía trên đều SAI. Trong cả chuỗi, chỉ đúng MỘT nhánh được chạy (nhánh đúng đầu tiên), rồi bỏ qua phần còn lại.

Nếu thân chỉ một câu lệnh thì không bắt buộc, nhưng NÊN luôn dùng { }. Thiếu { }, khi thêm dòng thứ hai sau này rất dễ sinh lỗi (câu thứ hai không còn thuộc if nữa).

switch so khớp MỘT giá trị với các case bằng phép “==”. Hợp khi có nhiều trường hợp rời rạc (thứ trong tuần, lựa chọn menu). if/else if linh hoạt hơn: dùng được khoảng (>=, <=) và && / ||. switch chỉ chạy trên số nguyên hoặc char.

Để DỪNG sau khi chạy xong một case. Thiếu break, chương trình “rơi xuống” (fall-through) chạy luôn các case bên dưới cho tới khi gặp break hoặc hết switch - nguồn lỗi rất hay gặp.

Là nhánh chạy khi KHÔNG case nào khớp - giống vai trò của else. Nên có default để xử lý trường hợp ngoài dự kiến.

Có (nested if). Nhưng lồng nhiều tầng làm code khó đọc - thường gộp điều kiện bằng && hoặc dùng else if cho gọn hơn.

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Trong một chuỗi if / else if / else, bao nhiêu nhánh được chạy?

  1. 1

    Dương hay không?

    Viết chương trình đọc một số rồi in “Duong” nếu lớn hơn 0, ngược lại in “Khong duong”.

    Hoàn thành khi: if (n > 0) printf("Duong\n"); else printf("Khong duong\n");

  2. 2

    Xếp loại

    Dùng công cụ ở Bước 2: điểm 6.5 cho ra loại gì?

    Hoàn thành khi: C - Trung bình (6.5 không ≥ 9, không ≥ 7, nhưng ≥ 5).

  3. 3

    Thứ tự nhánh

    Nếu đảo nhánh “else if (diem >= 5)” lên TRƯỚC “else if (diem >= 7)”, thì điểm 8 sẽ ra loại gì? Vì sao?

    Hoàn thành khi: Ra Trung bình (sai!) - vì 8 ≥ 5 khớp trước nên dừng luôn. Bài học: xếp điều kiện chặt nhất lên đầu.

  4. 4

    switch thứ trong tuần

    Viết switch in tên thứ ứng với số thu = 2..8 (2 = Thứ hai … 8 = Chủ nhật), default in “Khong hop le”.

    Hoàn thành khi: Mỗi casebreak; thu = 3 → in “Thu ba”.

  5. 5

    Quên break

    Một switch bị thiếu breakcase 1. Với x = 1 nó in ra những gì?

    Hoàn thành khi: In nội dung case 1 RỒI rơi xuống các case dưới (fall-through) cho tới khi gặp break/hết switch.

  6. 6

    Chẵn hay lẻ

    Viết if dùng phép “%” để in “Chan” nếu n chẵn, “Le” nếu n lẻ.

    Hoàn thành khi: if (n % 2 == 0) printf("Chan\n"); else printf("Le\n");