黑马程序员技术交流社区

标题: switch语句细节 [打印本页]

作者: 18343105017    时间: 2016-6-21 23:17
标题: switch语句细节
本帖最后由 18343105017 于 2016-6-23 22:06 编辑

细节:1):break是可以省略的,如果省略了就一直执行到遇到break为止;
           2):switch 后面的小括号中的变量应该是byte,char,short,int四种类型中的一种;
           3):default可以写在switch结构中的任意位置;
1.case default的匹配工作只做一次 2.一旦进入代码区,就是从头执行到尾直到遇到break

例1:
int a=1;
switch (a) {

        default:
            printf("exe default\n");
            
        case 1:
            printf("exe case 1\n");
   
        case 2:
            printf("exe case 2\n");
            
    }
结果:
exe case 1
exe case 2

如果匹配不到case 就走default进入代码区,代码区是啥?就是除了前面case default剩下的部分

int a=1;
    switch (a) {
            
        default:
            printf("exe default\n");
            
        case 2:
            printf("exe case 2\n");
   
        case 3:
            printf("exe case 3\n");
               
    }

这里没有匹配到case就从default进入代码区,代码区就是

            printf("exe default\n");
            
            printf("exe case 2\n");
   
            printf("exe case 3\n");

所以结果就是
exe default
exe case 2
exe case 3

你这样放

        case 2:
            printf("exe case 2\n");
   
        default:
            printf("exe default\n");

        case 3:
            printf("exe case 3\n");

没有匹配到case从default进入代码区
结果就是
exe default
exe case 3

这就是switch本来应该执行的顺序,每个case后面的代码本来都是连在一起的,代码部分就是一个整体,从头执行到尾

可是代码区里面插入了break,打破规则,让每个case独立感觉像是一个分支,执行完就结束

printf("exe case 2\n");
break;
printf("exe default\n");
break;
printf("exe case 3\n");
break;

有了break的代码区变成了一段一段的,从而产生错觉,感觉像是分支,还纠结究竟执行哪个,其实没有break捣蛋,只要进入代码区,管它啥从头执行到尾



作者: L1ub0w3n    时间: 2016-6-22 22:44
很好!温故知新!
作者: 18343105017    时间: 2016-6-22 23:00
这都是从复习笔记中摘过来的

作者: Kingchen    时间: 2016-6-22 23:02
顶一个!
作者: 18343105017    时间: 2016-6-22 23:06
Kingchen 发表于 2016-6-22 23:02
顶一个!

感谢,感谢
作者: 天之骄子no1    时间: 2016-6-23 20:09
楼主第二句话有点问题 switch 后面的小括号中的变量类型,除了byte,char,short,int四种类型外,String  和枚举类型也都可以的
作者: 940752944    时间: 2016-6-23 20:51
好像是先匹配case后面的值,如果没有你相同的就执行default,如果把default放前面不一定先执行default
比如这个例子int x=2,y=3;
switch(x)
{
        default:
                y++;
        case 3:
                y++;
        case 4:
                y++;
}
System.out.println("y="+y);

作者: 18343105017    时间: 2016-6-23 21:54
天之骄子no1 发表于 2016-6-23 20:09
楼主第二句话有点问题 switch 后面的小括号中的变量类型,除了byte,char,short,int四种类型外,String  和 ...

恩 1.5版本后枚举可以  1.7版本后String可以
作者: 18343105017    时间: 2016-6-23 22:04
940752944 发表于 2016-6-23 20:51
好像是先匹配case后面的值,如果没有你相同的就执行default,如果把default放前面不一定先执行default
比如 ...

恩 我复制粘贴的时候还真没注意到   谢谢指出
作者: oxiwangz    时间: 2016-6-30 20:00
不错!温故知新。
作者: oxiwangz    时间: 2016-6-30 20:27
很不错,温故知新,赞一个
作者: 他的好    时间: 2016-6-30 20:36
有点问题
细节:1):break是可以省略的,如果省略了就一直执行到程序末尾结束,如果省略掉break会有出现case穿透现象,有时候写程序会用到case穿透

           2):switch 后面的小括号中的变量应该是byte,char,short,int四种类型中的一种;jdk1.5以后可以是枚举,jdk1.7以后可以是字符串(String)

           3):default可以写在switch结构中的任意位置;不管default在什么位置,都是先匹配case的值




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2