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++博大精深,望勿浮躁,共勉。