先来看个例子:
#include
int main()
{
char str[] = “SSSWILA”;
char bc;
int k;
for (k = 2; (bc = str[k]) != ‘\0’; k++)
{
switch (bc)
{
case ‘I’: ++k; break;
case ‘L’: continue;
default: std::cout << bc;
continue;
}
std::cout << “8”;
}
该程序运行后输出的结果是SW8A。
那么究竟是怎么运行的呢?
首先要看字符串数组str[]=“SSSWILA”,学过数组的都知道,数组的下标是从0开始,也就是说str[]包含的元素,字符串数组以’\0’结尾,如下:
上面程序中k=2开始
当k=2时,bc=str[2]=‘S’(参考上述表格),执行到switch分支结构时,前面2个条件均不符合,所以执行default那一句,也就是std::cout<<str[2],但default语句执行结束时,并没有break帮助其结束switch分支,而替代的是continue,此时的continue对switch语句其实没有影响,影响的是外围for循环,当执行到关键字continue时,外围for循环直接从continue这里跳过去k++(k=3)而执行下一次循环了,所以continue之后,第一次循环时,根据结果推导出,最后并没有执行switch分支后的std::cout<<“8”;语句。同理第二次循环,根据结果得到的结论也是没有执行std::cout<<”8“。
所以当k=2,k=3时,输出的结果时SW。
当k=4时,bc=str[4]=‘I’,到switch里,执行case ‘I’,++k;break;
此时++k,k=5,等break出了switch,但没有终止循环内的语句,所以顺序执行了后买的std::cout<<“8”,所以输出了"8",此时由于前面k=5,for循环又在执行一次k++, k=6.
(这里当k=5时,其实并没有执行for循环,因为在当k=4时,其实在switch里面已经将k的值进行一次加1,得到k=5,当输出"8"后,for循环的第三个语句又将k值加1,而进行到后面一次循环)
当k=6时,bc=str[6]=‘A’,进入swtich时,执行default那一条指令,和当k=2一样,也没有输出”8“。此时k值再加1,k=7
当k=7时,bc=str[7]=‘\0’,此时循环条件不成立,循环终止。
最后程序输出的结果SW8A。
综上分析可以得出的结论是,当循环(for、while循环)中包含switch语句块,当执行到switch中的break语句时,switch分支执行完成,顺序执行switch语句块后面的代码。当执行到switch中的continue语句时,不仅跳出了switch语句,而且还跳出了循坏,switch语句块后面的代码没有被顺序执行。
写在最后,continue如果单独放在switch语句中,则不能编译通过,想要使用必须搭配循环才能使用。