1. switch语句的执行
误解:程序只会执行匹配的case标号相关联的语句。
正解:程序会从匹配的case标号为起点开始执行,并跨越其后的case边界继续执行其他语句,直到switch结束或遇到break语句为止。
所以当case标号后缺少break时就会发生错误,见下例:
<span style="font-size:14px;"><span style="white-space:pre"> </span>char ch;
<span style="white-space:pre"> </span>int a = 0, b = 0, c = 0;
while(cin>>ch)
{
switch(ch)
{
case 'a':
++a;
case 'b':
++b;
case 'c':
++c;
}
}
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;</span>
如果输入的ch为a,则++a,++b,++c都会执行。
2. switch内部的变量定义
对于switch结构,只能在它的最后一个case标号或default标号后面定义变量,制定这个规则是为了避免出现代码跳过变量的定义和初始化的情况。
现在我们考虑如下的情况:
<span style="font-size:14px;">#include <iostream>
using namespace std;
int main()
{
bool b = false;
switch (false)
{
case true:
int ival;
break;
case false:
ival = 3;
cout << ival << endl;
}
return 0;
}</span>
变量从它的定义点开始有效,直到它所在块结束为止;变量的声明和定义的作用是在静态域,与它是否执行到没有关系。int ival; 这是一个定义,它无需执行则在switch的整个作用域中有效,因此此段代码执行无误,不会报错。但是如果将此句改成定义并初始化:int ival = 0; 或string ival;,就会报错:error C2360: “ival”的初始化操作由“case”标签跳过,且定义ival后的每个case标号都会报这个错误。
因此,1)如果某个变量在多个case语句中会用到,需要在最后一个case标号或default标号后面定义初始化变量;2)如果需要为某个特殊的case定义变量,则可以引入块语句,变量只在该块中有效。