必备技能3.2:switch 语句
C++中的第二个用来选择的语句就是switch语句。switch语句提供多个分支的选择,因此它可以使程序在多个选项中进行选择。尽管一系列的嵌套if语句也可以实现多分支的检测,但是在多数情况下,switch语句会更有效。当进行匹配的时候,表达式的取值会与一些列的常量值进行连续地检测。当匹配时,和该匹配相关联的语句序列就会被执行。switch语句的通用形式如下:
switch (表达式)
{
case 常量1:
语句序列
break;
case 常量2:
语句序列
break;
case 常量3:
语句序列
break;
.
.
.
default :
语句序列
}
其中的表达式的值必须是字符或者是整数值(浮点数是不允许的)。通常情况下,控制switch语句的表达式只是一个简单的变量。case分支中的常数必须是整数或者是字符常量。
其中的default语句只有在没有找到匹配的时候才会执行。default语句是可选的。如果没有default语句,并且也没有找到匹配的case,那么什么都不会做。如果找到了匹配的case分支,那么和该case分支相关联的语句就会被执行,直到遇到一个break语句,或者直到case语句的结束或者是到default语句,或者是到switch语句的结尾。
关于switch语句有四点需要明确注意:
1. switch 语句和if语句的不同之处是switch语句只能进行相等的条件检测,而if语句则可以进行其它更多的条件检测。
2. 在switch中,不能有两个case分支的常量取值是一样的。当然,嵌套的switch语句中,内外两个switch中的case分支的常量可以有相同的取值。
3. switch语句通常比if嵌套更高效。
4. 和每个case相关联的语句序列并不是一个代码块,然而整个switch语句却是一个代码块。这一点的重要性会随着我们对C++的学习而越来越明显。
下面的程序演示了switch的用法。它要求用户输入一个1到3之间的数字,然后显示一个和该数字相关的言语。如果输入的是其它的数字,则显示错误信息。
/*
A simple proverb generator that
demonstrates the switch.
*/
#include <iostream>
using namespace std;
int main()
{
int num;
cout << "Enter a number form 1 to 3:";
cin >> num;
switch(num)
{
case 1:
cout << " A rolling stone gathers no moss.\n";
break;
case 2:
cout << " A bird in hand in worth two in the bush. \n";
break;
case 3:
cout << " A fool and his money are soon parted.\n";
break;
default:
cout << " You must enter either 1,2,or 3.\n";
}
return 0;
}
下面是两个示例运行结果:
Enter a number form 1 to 3:1
A rolling stone gathers no moss.
Enter a number form 1 to 3:5
You must enter either 1,2,or 3.
从技术层面来讲,break语句也是可选的,尽管大部分的应用程序中的switch语句中都会使用break语句。当在一个switch 中的case相关联的语句中出现break的时候,程序的流程就会跳出整个switch语句,进而执行switch外的下一条语句。然而,一个case相关联的语句中没有以break来结束,那么所有在匹配上的case分支中的语句以及下面的语句都会被执行,直到遇到一个break语句或者是到了switch语句的结束。举例来说,仔细研究下面的程序,猜猜看会在屏幕上显示什么?
/* A switch without break statements.
*/
#include <iostream>
using namespace std;
int main()
{
int i;
for ( i = 0; i < 5; i++)
{
switch ( i )
{
case 0: cout << " less than 1\n";
case 1: cout << " less than 2\n";
case 2: cout << " less than 3\n";
case 3: cout << " less than 4\n";
case 4: cout << " less than 5\n";
}
cout << '\n';
}
return 0;
}
这个程序的输出如下:
less than 1
less than 2
less than 3
less than 4
less than 5
less than 2
less than 3
less than 4
less than 5
less than 3
less than 4
less than 5
less than 4
less than 5
less than 5
正如这个程序演示的那样,case中如果没有break语句,程序会执行到下一个case中去。当时我们是可以有空的case的,正如下面的程序段一样:
switch(i)
{
case 1:
case 2:
case 3:
cout << " i is less than 4":
break;
case 4:
count << " i is 4 ";
break;
}
在上面的这个程序段中,如果i的值为1,2或者3,就会输出下面的信息: i is less than 4;如果i的值是4就会输出i is 4。像这个程序中的那样,“堆叠”的case分支在多个case分支公用相同的代码的时候非常常见。
嵌套的switch语句
在程序中很有可能用到一个switch语句嵌套在另外一个switch语句中。即使是内外层的case分支中的常量是相同的,这也不会引起冲突。例如,下面的代码段是可以接受的:
switch(ch1)
{
case 'A': cout << " This A is part of outer switch";
switch(ch2)
{
case 'A':
cout << "This A is part of inner switch";
break;
case 'B':
//.......
}
break;
case 'B':
//.....
}
练习:
1. switch 的控制表达式必须是什么类型?
2. 当switch表达式匹配上了一个case的常量,会发生什么?
3. 如果一个case相关的语句序列中没有用break来终止,会怎样?
答案:
1. switch的控制表达式必须是整数类型或者字符类型。
2. 当switch表达式匹配上了一个case的常量,那么和该case相关联的语句就会被执行。
3. 一个case相关联的语句中没有以break来结束,那么所有在匹配上的case分支中的语句以及下面的语句都会被执行,直到遇到一个break语句或者是到了switch语句的结束。
专家解答:
问:当遇到多个分支选择的时候,我们应该如何确定是应该采用if-else-if的阶梯式结构了还是应该采用switch语句了?
答:通常情况下,在控制选择过程的条件不是简单的的值的情况下,我们使用if-else-if的阶梯式结构。比如,考虑下面的if-else-if阶梯结构:
if ( x < 10 ) //...
else if ( y > 0 ) //...
else if ( !done )///....
这样的结构不能用switch语句来代替,因为三个不同的条件中包含了不同的变量,而且变量的类型还不一样。什么样的变量可以用来控制switch语句了?同样,在检测浮点数的值的时候或者别的不能在switch中用的类型的时候,我们需要使用if-else-if的阶梯结构。
按照原文的结构,下一篇应该为:http://blog.csdn.net/zhangxingping/article/details/7052481