switch case语句详解---连C++ Primer都会出现的语法错误

来源:互联网 发布:淘宝买眼镜靠谱吗 编辑:程序博客网 时间:2024/06/06 13:05

CSDN大牛较多,本人小白,若交流,本人欢迎,若言语偏颇,请绕行。
这二天,工作比较空闲,就看了一些基础的C++语法知识,收获颇多,下面只讲switch  case语句的一些语法细节。请大家坚持看完,第五大点是重点,经测试连C++ Primer都给出了错误的讲解。若为大牛,请直接拖到文章最后看最后一大点。

一、case标号内是否可以使用continue代替break?
    答案是否定的。continue只用于循环语句中,作用是中止本次循环;break语句才能中断switch  case控制流(return、goto等且不算作正常的中断)。

二、default只可以写在所有case标号之后吗?
    答案也是否定的。default可以写在任何位置且作用不变,只是看起来很别扭而已,你可以理解default是一个特别的case,并不代表着一个switch的结束。
    这是新手经常会误解的知识点,总觉得default之后,switch就结束了,这是一种固定思维带来的错误推断。

三、下面的代码是正确的吗?
    char ch;
    switch(ch)
    {
     case:
     default:
    }

    答案是不正确。一个标号不能独立不能独立存在,它必须位于语句之前。如果是空语句,你写成如下形式。

    char ch;
    switch(ch)
    {
     case:
         ;
     default:
         {}     // ;,{}可以互换
    }

四、下面的代码是正确的吗?若正确,执行结果是什么?若不正确,为什么?

        char ch = 'f';
        switch(ch)
        {
                default:
                        cout << "I'm default." << endl;
                        ch = 'b';
                case 'a':case 'b':case 'c': case 'd':
                {      
                        cout << ch << endl;
                        break;
                }
                cout << "Do I run?" << endl;
        }
  
     代码是正确的。运行结果是:
 I'm default.
        b

五、这一题是我想要说的重点,因为连C++ Primer中文版(第四版)这本书也讲解错误。详情见C++ Primer中文版(第四版)176页6.6.5小节的第一句。(原文为:“对于switch结构,只能在它的最后一个case标号或者default标号后面定义变量:……”)
    下面的这几段代码是正确的吗?如果不正确为什么?
    5.1 char ch = 'f';
        switch(ch)
        {
       default:
                break;
       case 'f':
                break;
       case 'a':
               int temp = 0;
       break;
        }
 
 代码是正确的,g++编译通过。

    5.2 char ch = 'f';
        switch(ch)
        {

        case 'f':
               break;
        case 'a':
               break;
        default:
               int temp = 0;
               break;
        }

 代码是正确的,g++编译通过。
    5.3 char ch = 'f';
        switch(ch)
        {
        default:  
                 break;
        case 'b':
                 break;
        case 'f':

                 int temp = 0;
                 break;
        case 'a':
                 break;
        }

 代码是错误的,g++编译未通过。
 通过上面的三个例子,“对于switch结构,只能在它的最后一个case标号或者default标号后面定义变量”这句话似乎是正确的。请看下一例。
    5.4 char ch = 'f';
        switch(ch)
        {
       default:
                int temp = 0;
                break;
       case 'f':
                break;
       case 'a':
               break;
        }

 代码是错误的,g++编译未通过。所以说C++ Primer的前半句是正确的,而后半句是错误的。应该改成“对于switch结构,只能在它的最后一个标号(switch和case)后面定义变量”。
 
 解释这个问题,请见第二点,default本质上与case并无不同,你可以把他看成范围较大的case。

 现在再解释一下,为什么只能在switch结构的最后一个标号后面定义变量?
 答:拿5.3的代码为例,大家都知道temp的生命周期为开始定义的位置至这个块语句的结束(也就是到‘}‘这个位置)。要知道switch  case语句为块语句,也就是temp变量会在块结束之前一直存在,那么case 'b'中当然可以使用这个变量。但是如果说ch = 'b',这时程序会直接跳到case 'b'而不会跳到temp变量的声明定义处的case 'f'中,此处若使用变量temp,那么temp就是未定义就使用了。为了避免这种情况的发生,所以C++规定“对于switch结构,只能在它的最后一个标号后面定义变量”,这样就有效避免了变量未定义就使用的问题的发生。

 

C++博大精深,望勿浮躁,共勉。

原创粉丝点击