1. switch 语句
C语言中的switch语句测试表达式中变量的值,并依次和其与多种情况比较。 一旦找到匹配,就会执行与该匹配指定的语句块。
switch 语句允许我们在许多备选方案中执行一个代码块。
你可以用 if…else..if 梯子做同样的事情。但是,switch 语句的语法更容易读写。
一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。
如果未找到表达式变量匹配的值,则执行默认语句,控制将退出switch语句。
C 语言中 switch 语句的语法:
switch( expression )
{
case value-1:
Block-1;
Break;
case value-2:
Block-2;
Break;
case value-n:
Block-n;
Break;
default:
Block-1;
Break;
}
Statement-x;
switch 语句中的 expression 是一个常量表达式,必须是一个整型或字符类型。
在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值(value-1, value-2, … value-n) 和一个冒号。
case 的 常量值(value-1, value-2, … value-n) (必须与 switch 中的expression变量具有相同的数据类型,且必须是一个常量。
当被测试的变量等于 case 中的常量时,case 后跟的语句(Block-1, or Block-2, or Block-n)将被执行,直到遇到 break 语句为止。
当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行(Statement-x)。
每一个 case 都需要包含 break(我们主张,但如果没有break也行,程序变复杂)
一个 switch 语句可以有一个可选的 默认 case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。
default case 中的 break 语句不是必需的。
下面图可以看出各个case的选择和控制流如何退出。
例1.1 简单的计算器
// Program to create a simple calculator #include <stdio.h> int main() { char operation; double n1, n2; printf("Enter an operator (+, -, *, /): "); scanf("%c", &operation); printf("Enter two operands: "); scanf("%lf %lf",&n1, &n2); switch(operation) { case '+': printf("%.1lf + %.1lf = %.1lf",n1, n2, n1+n2); break; case '-': printf("%.1lf - %.1lf = %.1lf",n1, n2, n1-n2); break; case '*': printf("%.1lf * %.1lf = %.1lf",n1, n2, n1*n2); break; case '/': printf("%.1lf / %.1lf = %.1lf",n1, n2, n1/n2); break; // operator doesn't match any case constant +, -, *, / default: printf("Error! operator is not correct"); } return 0; }
Enter an operator (+, -, *, /): -
Enter two operands: 32.5
12.4
32.5 - 12.4 = 20.1
用户输入的 – 运算符存储在操作变量中。并且,两个操作数 32.5 和 12.4 分别存储在变量 n1 和 n2 中。
由于操作为-,程序的控制跳转到
printf("%.1lf - %.1lf = %.1lf", n1, n2, n1-n2);
最后,break 语句终止 switch 语句。
例1.2 检查一个整数是否是8
#include <stdio.h> int main() { int num = 8; switch (num) { case 7: printf("Value is 7"); break; case 8: printf("Value is 8"); break; case 9: printf("Value is 9"); break; default: printf("Out of range"); break; } return 0; }
结果:
Value is 8
- 赋予初始化整数变量num的值为8;
- switch语句开始把每个case的值和存储在变量num中的值进行比较;
- 在该程序中,由于存储在变量num中的值为8,到case 8后, num 找到匹配的值,执行打印语句然后break退出。
例1.3.把一个1-7内的整数用文字表示出来
main(){ int a; printf("input integer number between 1 - 7: "); scanf("%d",&a); switch (a) { case 1: printf("Monday\n"); break; case 2: printf("Tuesday\n"); break; case 3: printf("Wednesday\n"); break; case 4: printf("Thursday\n"); break; case 5: printf("Friday\n"); break; case 6: printf("Saturday\n"); break; case 7: printf("Sunday\n"); break; default: printf("error\n"); break; } }
如果不用“break”,该程序会执行后面所有语句。
例1.4.switch语句的另外一种用法
#include <stdio.h> int main() { int number=5; switch (number) { case 1: case 2: case 3: printf("One, Two, or Three.\n"); break; case 4: case 5: case 6: printf("Four, Five, or Six.\n"); break; default: printf("Greater than Six.\n"); } }
结果
2.嵌套switch语句
顾名思义,嵌套switch语句是switch语句里面还有switch语句。
例2.1 查验用户名和密码
#include <stdio.h> int main() { int ID = 500; int password = 000; printf("Plese Enter Your ID:\n "); scanf("%d", & ID); switch (ID) { case 500: printf("Enter your password:\n "); scanf("%d", & password); switch (password) { case 000: printf("Welcome Dear Programmer\n"); break; default: printf("incorrect password"); break; } break; default: printf("incorrect ID"); break; } }
scanf 命令把标准输入的字符或整数存入到变量的地址内。
初始化的两个整数变量:ID和密码
外部switch语句比较ID输入值,执行与其值匹配的语句块(当ID == 500时)
ID正确的情况下,则利用内部switch语句比较password的输入的值,并执行与匹配的大小相链接的语句(当password == 000时),如果密码不正确,将打印出密码不正确。
如果ID输入不正确,程序将打印出ID不正确。就不进入内部switch语句。
为什么需要switch语句?
if-else语句存在一个潜在问题,即每当替代路径的数量增加时,程序的复杂性就会增加。 如果在程序中使用多个if-else构造,则程序可能会变得难以阅读和理解。
甚至可能使编写程序的开发人员自己都感到困惑。解决此问题的方法是switch语句,简单明了。
摘要:
- switch语句是 C语言的决策确定(decision making)语句;
- 涉及多个决策的程序中使用switch语句;
- switch必须包含可执行的expression;
- 每个case必须包含一个break;
- case value必须是常量且唯一;
- 默认是可选的;
- 多个switch语句可以相互嵌套。