Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Khác biệt giữa while(1) và while(0) trong C/C++

Cả while(1) và while(0) là vòng lặp while với điều kiện hằng số, nhưng hành vi hoàn toàn khác nhau.

while(1) - Vòng lặp vô tận (Infinite Loop)

  • 1 (bất kỳ giá trị khác 0) luôn true
  • Vòng lặp chạy mãi mãi cho đến khi gặp break, return, exit(), hoặc ngoại lệ
  • Thường dùng cho: event loop, server loop, game loop, menu chương trình

Ví dụ: Menu chương trình


#include <iostream>

using namespace std;

int main() {
    int choice;
    
    while (1) {  // Vòng lặp vô tận
        cout << "\n=== MENU ===\n";
        cout << "1. Tinh toan\n";
        cout << "2. Hien thi\n";
        cout << "3. Thoat\n";
        cout << "Chon: ";
        cin >> choice;
        
        if (choice == 3) {
            break;  // Thoát vòng lặp
        }
        
        switch (choice) {
            case 1: cout << "Tinh toan...\n"; break;
            case 2: cout << "Hien thi...\n"; break;
            default: cout << "Lua chon khong hop le\n";
        }
    }
    
    cout << "Tam biet!\n";
}

while(0) - Vòng lặp không bao giờ chạy

  • 0 luôn false
  • Thân vòng lặp không bao giờ được thực thi
  • Thường dùng trong macro để tạo khối lệnh (do-while(0) pattern)

Ví dụ: while(0) không chạy


#include <iostream>

using namespace std;

int main() {
    cout << "Bat dau\n";
    
    while (0) {
        cout << "Day se khong bao gio in ra\n";
    }
    
    cout << "Ket thuc\n";
}

Kết quả

Bat dau
Ket thuc

Ứng dụng thực tế của while(0): Macro an toàn

Pattern do { ... } while(0) phổ biến trong macro để:

  • Tạo khối lệnh (block) có thể dùng sau if không ngoặc
  • Tránh lỗi dangling else
  • Cho phép ; sau macro

// Macro KHÔNG an toàn
#define UNSAFE_MACRO(x)  \
    if (x > 0)           \
        printf("Duong\n"); \
    else                 \
        printf("Am\n")

// Macro AN TOÀN với do-while(0)
#define SAFE_MACRO(x)    \
    do {                 \
        if (x > 0)       \
            printf("Duong\n"); \
        else             \
            printf("Am\n"); \
    } while (0)

int main() {
    if (condition)
        SAFE_MACRO(5);  // OK - một statement
    else
        printf("Khong thuc hien\n");
}

So sánh tóm tắt

Đặc điểmwhile(1)while(0)
Điều kiệnLuôn trueLuôn false
Thân loop chạyVô tận (cho đến break)Không bao giờ
Dùng chínhEvent loop, server, gameMacro do-while(0)
Tương đươngfor(;;), while(true)if(0) { ... }

Khuyến nghị

  • Vòng lặp vô tận: Dùng while (true) hoặc for (;;) (rõ ràng hơn while(1))
  • Macro khối: Dùng do { ... } while (0)
  • Không bao giờ viết while(0) trong code logic thường (dead code)