那这个答案应该是4,2为啥和下面的不一样
这个default是无条件执行的吧?按道理上面那个应该也是这样吧。
那这个答案应该是4,2为啥和下面的不一样
这个default是无条件执行的吧?按道理上面那个应该也是这样吧。
当表达式的值与每一个case语句都不匹配时,你也想执行一些代码处理数据时,就可以加上default语句
default:
(1)每个switch语句中只能出现一条default子句。
(2)default语句可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
下面做一个小练习:
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{//switch允许嵌套使用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
输出:m = 5,n = 3
分析:
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)//此时n为1
{
case 1://进入
m++;//m变为3
case 2://继续
n++;//n变为2
case 3://继续
switch (n)//此时n为2
{//switch允许嵌套使用
case 1:
n++;
case 2://进入
m++;//m变为4
n++;//n变为3
break;//跳出case 3:的嵌套switch
}
case 4://继续
m++;//m变为5
break;//跳出外部switch
default:
break;
}
printf("m = %d, n = %d\n", m, n);//m = 5,n = 3
return 0;
}
//输出:m = 5,n = 3
default所代表的意思是当switch的参数不论任何case匹配时,进行default执行,因为default本质上仍然是一种case。如果仅仅只是是为了判断是否进入default,而并不需要做其他处理,可以将default供认标记为“未使用”以去除编译器检测时的warning。下面是一个示例代码:
int num = 10;
switch(num) {
case 1:
cout << "1" << endl;
break;
case 2:
cout << "2" << endl;
break;
default:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-label"
unused_label:
#pragma clang diagnostic pop
break;
}
在这里,我们利用了忽略警告的预处理指令#pragma clang diagnostic,将default的标签设置为未使用,从而绕过编译器的检测并避免产生warning。需要注意的是,忽略警告并不等于忽略编译错误,在编译时仍然会产生其他的错误提示。
另外可以看到,default与case等效,它可以放在语句列表的任何位置并且语句流会像执行一个case标签一样执行default子句,一般来说我们需要将default放在所有的case语句的最后面。下面是一个示例代码:
int num = 10;
switch(num) {
case 1:
cout << "1" << endl;
break;
case 2:
cout << "2" << endl;
break;
default:
cout << "default" << endl;
break;
}
上面的代码会依次匹配1和2,由于num的值10并不在这两个范围内,最后会执行default,并输出"default"。
在考虑default时需要注意default的位置,如果default在某一个case之前,那么在对应的case语句中如果不写break,有可能会误触default标签,导致程序执行到错误的位置。因此,一般建议将default放在所有case语句的最后面,可以避免一些潜在的错误。下面是一个示例代码:
int num = 1;
switch(num) {
case 1:
cout << "Hello, ";
default:
cout << "world!" << endl;
break;
case 2:
cout << "Goodbye!" << endl;
break;
}
这个示例代码的本意是要输出"Hello, world!",但是由于default在case 2的前面,程序会误触default标签并执行到错误的位置,导致输出结果为"world!"。为了避免这种情况的发生,我们需要将default放到所有case语句的最后面,下面是修改后的代码:
int num = 1;
switch(num) {
case 1:
cout << "Hello, ";
break;
case 2:
cout << "Goodbye!" << endl;
break;
default:
cout << "world!" << endl;
break;
}
再次运行程序,可以看到顺利地输出了"Hello, world!"。