C和C++中的switch匹配case的问题,记住下面2条原则就行了:
- 只有当所有case都不匹配时才会进入default语句
- 当找到一个匹配(无论是case还是default)后,会进入下面的case语句,直到找到break才会跳出switch。
我把一个正常的switch的default语句转移到代码的最开始处然后执行代码可以发现问题:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
int main(int argc,char ** argv)
{
char str;
//如果输入了一个参数,那么将参数的第一个字符作为switch需要匹配的字符
if(argc==2)
str=argv[1][0];
switch (str)
{
default:
{
std::cout<<"default"<<std::endl;
break;
}
case ‘a‘:
{
std::cout<<"prefix a"<<std::endl;
break;
}
case ‘b‘:
{
std::cout<<"prefix b"<<std::endl;
break;
}
}
return 0;
}
为了验证上面第一点,即只有当所有case不匹配时才会进入default,现在我们把default放在switch语句的最上面,依次执行输入的首字符是a和b,c的情况:
可以发现第一种情况(不输入字符,即str为空)和第四种情况(输入的首字符是c,在switch中找不到匹配的case)没有找到匹配的case,所以进入了default语句,第二种情况和第三种情况找到了匹配的case,没有进入default。这个规则与default在switch的那个地方没有关系。
然后是第二个规则,当找到一个匹配后,无论匹配的是case还是default,都会一直向下执行直到遇到break跳出。这个规则对于匹配case时比较好理解,但是对于进入default时就不是很直观的,还是以上面的代码为例,注释掉default语句里的break,然后运行相同的测试用例:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
int main(int argc,char ** argv)
{
char str;
//如果输入了一个参数,那么将参数的第一个字符作为switch需要匹配的字符
if(argc==2)
str=argv[1][0];
switch (str)
{
default:
{
std::cout<<"default"<<std::endl;
// break;
}
case ‘a‘:
{
std::cout<<"prefix a"<<std::endl;
break;
}
case ‘b‘:
{
std::cout<<"prefix b"<<std::endl;
break;
}
}
return 0;
}
运行相同的测试用例的结果如下:
可以发现不输入任何字符和输入字符c即没有任何匹配的case而进入了default后它并没有立即退出switch,而是继续向下执行直到遇到break语句,所以它进入了case为a时的情形,这就是第二条规则。
时间: 2024-11-04 06:35:12