首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-01-18 
switchcase语句详解---连C++ Primer都会出现的语法错误CSDN大牛较多,本人小白,若交流,本人欢迎,若言语偏颇

switch case语句详解---连C++ Primer都会出现的语法错误
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++博大精深,望勿浮躁,共勉。 switch?case语法 C++?P C++?Primer讲解错误
[解决办法]
switch-case语法不是C++ Primer规定的,而且G++也只是一个按照语法规则来编译代码的工具。
若真想了解switch-case的语法,查看C++标准,而不是用G++等编译工具来测试。
测试出来的结果也只能说明,这个编译器对标准语法的支持程度,而不就是标准。

[解决办法]
原文说的是Variables can be defined following only the last case or default label个人觉得原文说的确实是有点问题
不过这种情况,像有人说的查C++标准中switch-case语法什么的根本不可能查到,因为C++标准规定了变量的作用域,同样规定了switch-casse的使用标准,并不会再去特意规定switch-casse语法中变量的定义规则的,因为这些东西可以从已经定义的变量规则和switch-casse语法中判断出来

热点排行