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
0luô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
ifkhô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ểm | while(1) | while(0) |
|---|---|---|
| Điều kiện | Luôn true | Luôn false |
| Thân loop chạy | Vô tận (cho đến break) | Không bao giờ |
| Dùng chính | Event loop, server, game | Macro do-while(0) |
| Tương đương | for(;;), while(true) | if(0) { ... } |
Khuyến nghị
- Vòng lặp vô tận: Dùng
while (true)hoặcfor (;;)(rõ ràng hơnwhile(1)) - Macro khối: Dùng
do { ... } while (0) - Không bao giờ viết
while(0)trong code logic thường (dead code)