Switch中的default陷阱

当年学C语言switch开关语句的时候,很多人会告诉你它是这么用的:

 

 
  1. switch(表达式){

  2.  
  3. case常量表达式1: 语句1;break;

  4.  
  5. case常量表达式2: 语句2;break;

  6.  
  7.  
  8. case常量表达式n: 语句n;break;

  9. default: 语句n+1;break;

  10. 其语义是:计算表达式的值。并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。

 

很多人当时都是这么理解的吧。

好,我们来看这样一个程序

 

 
  1. #include <stdio.h>

  2.  
  3. int main()

  4. {

  5. int c= 0, k;

  6. for (k = 1; k < 3; k++)

  7. switch (k)

  8. {

  9. default:c += k;

  10. case 2:

  11. c++; break;

  12. case 4:

  13. c += 2; break;

  14. }

  15. printf("%d",c);

  16. return 0;

  17. }

你觉得答案会是多少?

 

答案是3。

分析一下这个题目,首先看上去第一眼就很怪,怎么把default放在第一句了。那么程序是怎么执行的呢?

当k=1的时候,c+=k ——>c=1 这个时候要注意了,default后面并没有break,所以并不会跳出去,会执行case2,c++

——>c=2,遇到break,跳出。

当k=2的时候,执行case2 ,c++——>c=3;遇到break,跳出。

所以这里总结一下default的用法:

如果default语句在所有case最后,此时可以不加break 如果default语句之后还有case语句,如果不加break,则default语句执行过之后会继续下面的case语句,此时必须要在default之后加break语句,不过这种default用法是不推荐的,default顾名思义是缺省情况,只有任何条件都不匹配的情况下才会执行,所以应该将default语句放在所有case结束之后

 

再看一道题目  

//输入china#,打印出5,6

//输入china#,打印出5,6
#include <stdio.h>

int main()
{
	int v1=0,v2=0;
	char ch='\0';
	do
	{
		switch(ch)
		{
			case 'a':;
			case 'h':;
			default:v1++;
			case 'n':v2++;
		
		}
	}
	while((ch=getchar())!='#');
	printf("%d,%d",v1,v2);
	return  0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值