黑马程序员技术交流社区

标题: 它们的执行结果各是什么?为什么? [打印本页]

作者: 范晓冲    时间: 2014-1-1 14:13
标题: 它们的执行结果各是什么?为什么?
本帖最后由 范晓冲 于 2014-1-1 14:59 编辑

public class SwitchTest2{
                public static void main(String[] args){
                                int m=5;
                                switch(m){
                                                case 1:
                                                                System.out.println("111111");
                                                                //break;
                                                case 2:
                                                                System.out.println("2222222");
                                                                //break;
                                                case 3:
                                                                System.out.println("3333333");
                                                                break;
                                                case 4:
                                                                System.out.println("44444444");
                                                                break;
                                                default:
                                                                System.out.println("ddddddddd");
                                                                //break;                    
                                }        
                }        
}
****************************************************************************************************************
public class SwitchTest3{
                public static void main(String[] args){
                                int m=5;
                                switch(m){
                                          default:
                                                    System.out.println("ddddddddd");
                                                                //break;
                                                case 1:
                                                                System.out.println("111111");
                                                                //break;
                                                case 2:
                                                                System.out.println("2222222");
                                                                //break;
                                                case 3:
                                                                System.out.println("3333333");
                                                                break;
                                                case 4:
                                                                System.out.println("44444444");
                                                                break;                    
                                }        
                }        
}
SwitchTest2和SwitchTest3的执行结果各是什么?为什么是这种情况?

作者: 陈善奔    时间: 2014-1-1 14:26
不一样的。。。
switch语句是顺序执行的,也就是说,m=5,是default,接下来就往下执行,直到碰到break,或语句完毕。
break就是跳出语句。
作者: 高正新    时间: 2014-1-2 21:37
这个我也没弄明白。
switch执行的规则是如果有一个条件满足了,那么接下来的那些条件就不判断了。一直往下执行。
当添加了break之后,代码执行就结束了。(这些说的不是很明白,相信你自己也清楚)
关键是当default写在前面的时候,似乎虚拟机已经知道了后面的条件都不适合,直接选择了default,然后就继续往下执行了。
又或者虚拟机不知道下面的条件有没有满足当前的判断,循环了一遍,最后还是选择了default,然后接着往下执行了。
但是,无论它是怎么判断的,但是规则始终是没有改变的。
就是当一个条件满足了之后,接下来的条件它就不判断了,直接执行,除非遇到break,才会跳出switch。记住这一点,我感觉就可以了,哈哈
作者: 浮出一个美    时间: 2014-1-2 22:22
一般的规则楼上已经说得很清楚了.
switch执行的规则是如果有一个条件满足了,那么接下来的那些条件就不判断了。一直往下执行。
当添加了break之后,代码执行就结束了。
我就说说我测试后的一个小结论吧:
switch还是会先判断是否满足每一个case,满足并且执行到break就退出。
如果没有满足,继续往下执行,最后执行default,但是default没有break,所以又继续往下执行每一个case,直到break,或则程序结束。

作者: 松子    时间: 2014-1-2 22:40
switch语句的执行流程:进入switch语句后,就会根据表达式的值去找对应的case值。
                                     如果最终没有找到,就执行default的内容。
switch语句的结束:就是遇到break或者执行到程序的末尾
public class SwitchTest2{
                 public static void main(String[] args){
                                 int m=5;
                                 switch(m){
                                                 case 1:
                                                                 System.out.println("111111");
                                                                 //break;
                                                 case 2:
                                                                 System.out.println("2222222");
                                                                 //break;
                                                 case 3:
                                                                 System.out.println("3333333");
                                                                 break;
                                                 case 4:
                                                                 System.out.println("44444444");
                                                                 break;
                                                 default:
                                                                 System.out.println("ddddddddd");
                                                                 //break;                    
                                 }        
                 }        
}

本例中,变量值是5,case里面没有匹配到,就走default。
虽然没有break,但走到了程序结尾,所以程序结束了。输出结果是:ddddddddd
****************************************************************************************************************
public class SwitchTest3{
                 public static void main(String[] args){
                                 int m=5;
                                 switch(m){
                                           default:
                                                     System.out.println("ddddddddd");
                                                                 //break;
                                                 case 1:
                                                                 System.out.println("111111");
                                                                 //break;
                                                 case 2:
                                                                 System.out.println("2222222");
                                                                 //break;
                                                 case 3:
                                                                 System.out.println("3333333");
                                                                 break;
                                                 case 4:
                                                                 System.out.println("44444444");
                                                                 break;                    
                                 }        
                 }        
}
本例中,先匹配case的值,没有对应的值,就走default,输出ddddddddd。
因为default没有在switch语句结尾,也没有break,就出现了“case穿透”,
走完default之后,就不再考虑case的值是否匹配,直接从上到下执行,
直至遇到break或者走到结尾。本例中在case 3 遇到break结束。
最终的结果是:
ddddddddd
111111
2222222
3333333

希望能帮到你!

作者: 猎鹰tianya    时间: 2014-1-3 21:50
我的想法和楼上是一样一样的,就不多说了{:soso_e112:}
作者: 杨丽静    时间: 2014-1-4 16:48
第一个是
ddddddddd
首先表达式的值与每个case语句中的常量作比较,结果没有一个是匹配的,后遇到default,执行default语句,程序结束
111111
2222222
3333333
这个跟上一个不同的是没有判断case的常量就遇到了default语句,先执行default语句,在执行default之后,后面的不予判断就开始执行,直到遇到break程序结束



第二个是
ddddddddd
111111
2222222
3333333




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