1.如果switch语句的表达式和所有的case都没有匹配上,将直接跳转到switch结构之后的第一条语句。
2.case标签必须是整型常量表达式。例如:
char ch=getVal();
int ival=42;
switch(ch) {
case 3.14: //错误:case标签不是一个整数
case ival: //错误:case标签不是一个常量
}
另外,任何两个case标签的值不能相同。
3.如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支,除非程序显示地中断了这一过程。
例如:
unsigned count=0;
switch(ch)
{
case 'a':
case 'e':
++count;
break;
}
上述代码中,出现了a、e中的任意一个都会将count的值加1。
4.switch内部的变量定义
switch语句的执行可能会跨过某些case标签,如果程序跳转到了某个特定case,则switch结构中该case标签之前的部分会被忽略掉,如果被略过的代码含有变量定义,则需要注意以下原则:
C++语言不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。
例如:
case true:
string file_name;//错误:控制流绕过一个隐式初始化的变量
int ival=0;//错误:控制流绕过一个显式初始化的变量
int jval;//正确:因为jval没有初始化
case false:
jval=next_num();//正确:给jval赋一个值
上述代码第2、3行错误的原因都是因为程序执行过程可能绕开初始化语句,导致switch语句不合法。注意:初始化是在程序运行时才被调用的,而定义则是在编译的时候就完成检查并分配内存空间的。
另外,如果在某处一个带有初值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法的。例如:
case true:
{
string file_name=get_file_name();
}
break;
case false:
if(file_name.empty())//错误:file_name不在作用域之内
5.break语句结束的是本层循环,而continue结束的最近循环中的当前迭代,并立即开始下一次的迭代,其还会继续执行循环。