C++ 初学者指南 第三篇(2)

必备技能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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值