switch语句在处理多分支语句时是一种清晰结构(相比于一系列的if else if ...),
在一般书上的讲解时会给出如下的一般形式:
switch(表达式){
case 常量表达式1: 语句1;
case 常量表达式2: 语句2;
…
case 常量表达式n: 语句n;
default: 语句n+1;
}
switch后的括号里面
是一个表达式,根据这个表达式返回的值(通常是多值),我们来执行相应的语句,这就是下面
case语句所做的事情,case相当于一个if判断,所谓的常量表达式n其实就是switch后面表达式的值。
当我们看到这个switch语句的一般形式的时候,我们总会产生一系列的疑问:
(1)switch 语句在实际应用中一般怎么用?、
(2)case 后面可以跟几个语句?
接下来我们来解答这两个问题:
(1)在实际中我们习惯在每一个case语句最后加上一个break,跳出switch语句,如果我们不写break表达式,
那么程序还是会继续向下执行,去判断下一个case,从而浪费时间。当然你也可以利用这个特点来处理一些问题,
就像研发最常跟测试他们说的那句话:“这是特性,不是BUG!”,最后default语句可有可无,具体的选择看具体的
情况。
(2)上面的一般形式中case语句后只写了一个语句,最开始学的时候我特别疑惑,case后的语句只能跟
一个吗?我有很多语句怎么办,我在case语句里面还有if语句怎么办,其实这些担忧都是没有必要的,在case
语句后面可以有N多语句,这些语句的书写跟在正常逻辑下无区别,你在一个函数里怎么写if语句,在这里就怎么
写。下面我给出个具体例子来演示switch语句:
switch(in_temp)
{
case 1:
if (input_num == 0)
{
i--;
}else
{
i--;
grade -= grade / 10;
// if grade < 0 set grade = 0
grade = grade > 0 ? grade : 0;
if (input_num > number)
{
printf("Bigger than number\n",input_num);
}else
{
printf("Smaller than number\n",input_num);
}
}
break;
case 2:
i--;
grade -= (grade / 10);
grade = grade > 0 ? grade : 0;
// is even number
if (input_num % 2 == 0)
{
printf("Not prim\n");
}else
{
printf("Is prim\n");
}
break;
case 3:
i--;
grade -= (grade / 10);
grade = grade > 0 ? grade : 0;
//test the Prim() function
//number = 457;
if (Prim(number))
{
int leftn;
int rightn;
scanf("%d %d", &leftn, &rightn);
// output the Prim in [leftn,rightn]
for (int j = leftn; j <= rightn; ++j)
{
/* code */
if (Prim(j))
{
printf("%d ", j);
}
}
printf("\n");
}else printf("Not \n");
break;
case 4:
i--;
grade -= (grade / 10);
grade = grade > 0 ? grade : 0;
// judge the number can divide by 3
if (number % 3 == 0)
{
/* code */
printf("can multi by 3\n");
}else printf("can not multi by 3\n");
break;
default: break;
}
}
由上面的例子,我们就很清晰的看到了switch语句的应用。
另外还要注意一点:switch(val)里的参数val,在C++中只能取INT及以下的参数类型(char short等),
想string这些复杂的数据类型是不支持的。
谢谢你的阅读!