Bỏ qua để đến nội dung

Cấu trúc switch-case

switch-case là một cấu trúc điều khiển dùng để so sánh một biến với nhiều giá trị cụ thể, giúp thay thế một chuỗi dài các if/else if.

#include <iostream>
int main() {
int day = 3;
switch (day) {
case 1:
std::cout << "Thu Hai" << std::endl;
break;
case 2:
std::cout << "Thu Ba" << std::endl;
break;
case 3:
std::cout << "Thu Tu" << std::endl;
break;
default:
std::cout << "Ngay khac" << std::endl;
break;
}
return 0;
}
  • switch (bien): biến cần so sánh (chỉ hoạt động với kiểu số nguyên, char, hoặc enum - không dùng được với std::string)
  • case gia_tri:: nhánh khớp với giá trị cụ thể
  • break;: bắt buộc để thoát khỏi switch sau khi khớp - nếu quên, chương trình sẽ “rơi xuống” (fall-through) case tiếp theo!
  • default:: nhánh mặc định nếu không khớp case nào
int x = 1;
switch (x) {
case 1:
std::cout << "Mot" << std::endl;
// Thiếu break!
case 2:
std::cout << "Hai" << std::endl;
break;
default:
std::cout << "Khac" << std::endl;
}
// Kết quả in ra CẢ HAI dòng: "Mot" VÀ "Hai" (vì thiếu break ở case 1)

Đây là một trong những lỗi phổ biến nhất khi mới học C++ - chi tiết ở phần What the C++.

Fall-through có chủ đích (gộp nhiều case)

Phần tiêu đề “Fall-through có chủ đích (gộp nhiều case)”

Đôi khi việc “rơi xuống” là có chủ đích, dùng để gộp nhiều case xử lý giống nhau:

char grade = 'B';
switch (grade) {
case 'A':
case 'B':
std::cout << "Gioi" << std::endl; // Cả 'A' và 'B' đều vào đây
break;
case 'C':
std::cout << "Kha" << std::endl;
break;
default:
std::cout << "Can co gang" << std::endl;
}
char grade = 'A';
switch (grade) {
case 'A':
std::cout << "Xuat sac" << std::endl;
break;
case 'B':
std::cout << "Gioi" << std::endl;
break;
default:
std::cout << "Khac" << std::endl;
}

switch thường nhanh hơn một chuỗi if/else if dài (trình biên dịch có thể tối ưu thành bảng nhảy - jump table), nhưng chỉ hoạt động với giá trị rời rạc, cụ thể (không so sánh khoảng giá trị như if (x > 10)).

  • switch-case so sánh một biến với các giá trị cụ thể, chỉ dùng được với số nguyên, char, enum
  • Luôn nhớ break sau mỗi case, trừ khi cố ý muốn fall-through
  • default là nhánh xử lý khi không khớp case nào