跳到主要内容

C++ Switch Case

在C++编程中,switch case语句是一种多分支选择结构,它根据一个变量或表达式的值,从多个代码块中选择一个来执行。当你需要根据一个变量的不同取值执行不同操作时,switch case通常比多个if-else语句更加简洁和高效。

switch语句的基本语法

cpp
switch (expression) {
case constant1:
// 当expression等于constant1时执行的代码
statement(s);
break;
case constant2:
// 当expression等于constant2时执行的代码
statement(s);
break;
// 可以有任意数量的case语句
default:
// 当expression不匹配任何constant时执行的代码
statement(s);
}

语法解释

  1. expression:要被匹配的表达式,通常是一个变量或返回值
  2. constant:常量值,必须是整型或枚举类型
  3. break:使程序跳出switch语句
  4. default:可选的默认情况处理(当所有case都不匹配时)

switch语句的工作原理

当程序执行到switch语句时:

  1. 计算expression的值
  2. 将该值依次与每个case的常量值比较
  3. 如果找到匹配项,执行该case后面的代码,直到遇到break语句或switch语句结束
  4. 如果没有匹配项且存在default分支,则执行default后面的代码
备注

Switch语句的表达式和case标签必须是整数类型(包括char)或枚举类型,不能使用浮点数、字符串或其他类型作为case的判断依据。

基本示例

下面是一个简单的switch case示例,根据用户输入的数字(1-7)显示对应的星期几:

cpp
#include <iostream>
using namespace std;

int main() {
int day;
cout << "请输入一个数字 (1-7): ";
cin >> day;

switch (day) {
case 1:
cout << "星期一";
break;
case 2:
cout << "星期二";
break;
case 3:
cout << "星期三";
break;
case 4:
cout << "星期四";
break;
case 5:
cout << "星期五";
break;
case 6:
cout << "星期六";
break;
case 7:
cout << "星期日";
break;
default:
cout << "无效的数字!请输入1-7之间的数字。";
}

return 0;
}

输出示例

请输入一个数字 (1-7): 3
星期三

break语句的重要性

在switch语句中,break语句非常重要。如果省略break,程序会继续执行下一个case中的代码,这被称为"穿透"(fall-through)。

不使用break的示例

cpp
#include <iostream>
using namespace std;

int main() {
int num = 2;

switch (num) {
case 1:
cout << "一";
case 2:
cout << "二";
case 3:
cout << "三";
default:
cout << "结束";
}

return 0;
}

输出

二三结束
警告

如果不使用break语句,程序会从匹配的case开始,执行之后所有case的代码,直到遇到break或switch语句结束。这通常不是我们想要的行为,容易导致逻辑错误。

有意使用case穿透

在某些情况下,我们可能会故意省略break语句,以使多个case共享相同的代码:

cpp
#include <iostream>
using namespace std;

int main() {
char grade;
cout << "请输入您的成绩等级(A-F):";
cin >> grade;

switch (grade) {
case 'A':
case 'a':
cout << "优秀!";
break;
case 'B':
case 'b':
cout << "良好!";
break;
case 'C':
case 'c':
cout << "中等!";
break;
case 'D':
case 'd':
cout << "及格!";
break;
case 'F':
case 'f':
cout << "不及格,需要更多努力。";
break;
default:
cout << "无效的成绩等级!";
}

return 0;
}

输出示例

请输入您的成绩等级(A-F):b
良好!

在这个例子中,我们有意地让大写和小写字母共享相同的输出代码。

switch和if-else的比较

当分支选择比较少时,if-else和switch语句都可以使用。但当分支较多时,switch通常更清晰且可能更高效:

cpp
// 使用if-else
if (choice == 1) {
// 操作1
} else if (choice == 2) {
// 操作2
} else if (choice == 3) {
// 操作3
} else {
// 默认操作
}

// 使用switch
switch (choice) {
case 1:
// 操作1
break;
case 2:
// 操作2
break;
case 3:
// 操作3
break;
default:
// 默认操作
}

嵌套switch语句

switch语句可以嵌套使用,即在一个switch语句内部包含另一个switch语句:

cpp
#include <iostream>
using namespace std;

int main() {
int department = 1; // 1表示销售部
int position = 2; // 2表示经理

switch (department) {
case 1: // 销售部
cout << "销售部,";
switch (position) {
case 1:
cout << "职员";
break;
case 2:
cout << "经理";
break;
default:
cout << "未知职位";
}
break;
case 2: // 技术部
cout << "技术部,";
switch (position) {
case 1:
cout << "工程师";
break;
case 2:
cout << "主管";
break;
default:
cout << "未知职位";
}
break;
default:
cout << "未知部门";
}

return 0;
}

输出

销售部,经理

实际应用案例:简易计算器

下面是一个使用switch语句的简易计算器,展示了switch在实际程序中的应用:

cpp
#include <iostream>
using namespace std;

int main() {
char operation;
double num1, num2;

cout << "简易计算器" << endl;
cout << "请输入两个数字: ";
cin >> num1 >> num2;

cout << "请输入运算符 (+, -, *, /): ";
cin >> operation;

switch (operation) {
case '+':
cout << num1 << " + " << num2 << " = " << (num1 + num2);
break;
case '-':
cout << num1 << " - " << num2 << " = " << (num1 - num2);
break;
case '*':
cout << num1 << " * " << num2 << " = " << (num1 * num2);
break;
case '/':
if (num2 != 0) {
cout << num1 << " / " << num2 << " = " << (num1 / num2);
} else {
cout << "错误:除数不能为零!";
}
break;
default:
cout << "错误:无效的运算符!";
}

return 0;
}

输出示例

简易计算器
请输入两个数字: 10 5
请输入运算符 (+, -, *, /): *
10 * 5 = 50

switch语句的限制

虽然switch语句很有用,但它也有一些限制:

  1. 表达式类型限制:switch的表达式必须是整型或枚举类型,不能使用浮点数、字符串等
  2. 常量表达式:case标签必须是常量或常量表达式,不能是变量
  3. 重复case值:不允许有两个case标签值相同
  4. 表达式范围:不能直接测试范围条件(如case x > 0:是不允许的)

C++ 17中的强化switch语句

在C++17中,可以在case语句中使用初始化语句,这使得switch语句更加强大和灵活:

cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
int id = 42;

switch (int value = id % 10; value) {
case 0:
cout << "id最后一位是0";
break;
case 2:
cout << "id最后一位是2,值为:" << value;
break;
default:
cout << "id最后一位是其他数字";
}

return 0;
}

输出

id最后一位是2,值为:2

最佳实践

使用switch语句时,请遵循这些最佳实践:

  1. 总是使用break语句,除非你明确想要case穿透
  2. 如果使用case穿透,添加注释说明这是有意为之
  3. 总是包含default分支,即使它可能不被执行
  4. 保持case分支代码简短,如果逻辑复杂,考虑使用函数
  5. 检查输入是否在预期范围内,防止意外行为

总结

switch case语句是C++中一种强大的多分支选择结构,它为多条件判断提供了一种清晰、高效的方式。掌握switch语句可以让你的代码更易读、更简洁,尤其是在处理多个分支条件时。记住要注意break的使用,以及switch语句的各种限制,这样就能在适当的场景中充分利用这一控制结构。

练习

  1. 编写一个程序,使用switch语句根据输入的月份数字(1-12)显示对应的月份名称。
  2. 创建一个菜单驱动程序,使用switch语句处理用户选择的不同选项。
  3. 编写一个程序,使用switch语句根据输入的字符判断它是元音字母、辅音字母还是其他字符。
  4. 尝试实现一个简易的状态机,使用switch语句处理不同状态之间的转换。

这些练习将帮助你更好地理解和掌握switch case语句的使用。祝你学习愉快!