switch case语句和枚举
switch case 语句是另一种条件分支语句,它在一定程度上也能用if代替。但是呢,switch更方便列举所有可能的情况,看起来更直观。
而枚举呢,正是用来给各种可能的情况命名的,二者非常适合放在一起介绍。
一、switch - case 语句
switch-case 语句是另一种条件判断语句。
其格式为:
switch(变量或值)
{
case 第一种情况:
//一些操作
break;
case 第二种情况:
//另一些操作
break;
// case .....列举其他更多情况
default: //如果以上情况均不满足
//默认的操作
break;
}
switch举例:
string s = Console.ResadLine();
switch(s)
{
case "a":
Console.WriteLine("攻击");
break;
case "b":
Console.WriteLine("防御");
break;
default:
Console.WriteLine("逃跑");
break;
}
用if对比:
string s = Console.ReadLine();
if (s == "a") //第一种情况
{
Console.WriteLine("攻击");
}
else if(s == "b") //第二种情况
{
Console.WriteLine(“防御");
}
else //以上情况均不满足
{
Console.WriteLine("逃跑");
}
二者的结果相同。
从这里可以看出,在写switch时,这里不用相等性的判断。它的好处呢是更为简洁,但是坏处是不能把一些复杂的布尔表达式,放在括号里的位置。
/*写一个计算器程序。
1 提示用户先输入第一个数字,再第二个数字。
2 提示用户输入“+”、“-”、“*”或“/”四种运算之一。
3 根据输入的符号,打印两个数字运算后的结果。这一步请使用switch-case语句实现。
4 如果用户输入的运算符错误,提示输入错误。*/
while (true)
{
Console.WriteLine("请输入第一个数字:");
string input = Console.ReadLine();
int a = int.Parse(input);
Console.WriteLine("请输入第二个数字:");
input = Console.ReadLine();
int b = int.Parse(input);
Console.WriteLine("请输入一个运算符号(加减乘除):");
string sign = Console.ReadLine();
double result = 0;
switch (sign)
{
case "+":
result = a + b;
break;
case "-":
result = a - b;
break;
case "*":
result = a * b;
break;
case "/":
result = (double)a / b;
break;
default:
Console.WriteLine("输入错误");
Console.WriteLine();
Console.WriteLine();
return; //可以直接终止程序。
}
//打印结果
Console.WriteLine($"{a}{sign}{b}的结果是:{result}");
Console.WriteLine();
Console.WriteLine();
}
上述案例呢实现了计算器的基本用法,通过“return”指令,输错则程序直接终止。而return的本意是退出当前函数,当前默认是有且仅有Main函数,所以程序直终止。
那么,想要实现输入错误后直接重新输入,我们就需要更换return指令,退出循环并立即开始下一次循环。这里可以用continue指令,直接进入下一次循环。
二、switch的特点
·虽然if可以代替switch-case, 但在实际开发中switch-case语句很常用
·switch-case语句有几个特点:
1、直接跳转到对应情况,程序执行速度更快。(if会依次判断){若情况3不满足if,则判断else if...以此类推;而switch 可以直接跳转到情况3对应的case3 }
2、不能处理复杂的条件判断,需要复杂条件判断时用if更合适。
3、代码结构清晰,和枚举配合使用很容易读懂。
三、为什么要使用枚举?
·一般,可以用数字编号或者字符串等表示各种事物。
·例如当编写石头剪刀布的程序时,可以用1代表石头,2代表剪刀,3代表布。你会发现,用123在代替剪刀石头布非常不直观,当变量多时很容易搞错。因此需要枚举提供直观的编号。
例如我们想要定义春夏秋冬。
enum 季节 //enum为枚举
{
春,
夏,
秋,
冬,
}
如此一来当我们需要调用时,可以这样:
季节 season = 季节.春;
你会发现,变量season前的变量类型不再是int,string,double等,而是“季节”。这是因为我们优先将季节定义成一种类型,这是一种枚举类型,而其取值只能是春夏秋冬。
值得注意的是,enum中所定义的编号,背后都有对应的整数,默认第一个是0,之后顺次递增,即春代表0,夏代表1,秋代表2,冬代表3。
季节 season = 季节.春;
Console.WriteLine("请输入季节(1234)");
string input = Console.ReadLine();
//将input字符串转为数字
int n = int.Parse(input);
//将数字转化为枚举
season = (季节)n;
Console.WriteLine("season = " + (int)season);
switch (season)
{
case 季节.春:
Console.WriteLine("这是春天");
break;
case 季节.夏:
Console.WriteLine("这是夏天");
break;
case 季节.秋:
Console.WriteLine("这是秋天");
break;
case 季节.冬:
Console.WriteLine("这是冬天");
break;
}