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.
Cú pháp cơ bản
Phần tiêu đề “Cú pháp cơ bản”#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ặcenum- không dùng được vớistd::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
Cạm bẫy: quên break (fall-through)
Phần tiêu đề “Cạm bẫy: quên break (fall-through)”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;}switch với char
Phần tiêu đề “switch với char”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;}Vì sao dùng switch thay vì if/else?
Phần tiêu đề “Vì sao dùng switch thay vì if/else?”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)).
Tổng kết
Phần tiêu đề “Tổng kết”switch-caseso 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ớ
breaksau mỗi case, trừ khi cố ý muốn fall-through defaultlà nhánh xử lý khi không khớp case nào