A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋耀冬 中级黑马   /  2013-3-26 14:37  /  1600 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 宋耀冬 于 2013-3-27 10:08 编辑

class Demo
{
        public static void main(String[] args)
        {
                show(0);//15
                show(1);//14
        }        
        public static void show(int i)
        {
                switch(i)
                {        
                        default:
                                i+=2;
                        case 1:
                                i+=1;
                        case 4:
                                i+=8;                        
                        case 2:
                                i+=4;
                }
                System.out.println("i="+i);
        }        
}

这段代码是怎么执行的   我自己算的结果个打印的完全不同啊

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

9 个回复

倒序浏览
switch里没有break,所以,当i=0时,default,case1,case2,case4全都执行了。所以show(0)=15
当i=1的时候,default就不执行了。所以结果是14

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
switch语句结束有两种情况:1.遇到break;2.执行到switch语句结束。你的代码中没有break;因此会执行到switch语句结束,所以结果为:show(0);//15;show(1);//14

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
case语句里少了break语句,直接穿透了!
回复 使用道具 举报
本帖最后由 曾祥旭 于 2013-3-26 19:18 编辑

这个好像毕老师的教学视频中讲到这个问题了吧?
回复 使用道具 举报
(1)当传入的参数为0的时候,程序进入show方法中,先执行的是case 1,由于case 1中没有break语句,程序会一直执行下去,当读到case 2时,此时的i是13,但是,还是没有找到case 0这个条件,,所以,程序会执行default语句,我们知道default语句中有省略的break,直到这时程序结束,所以结果是15.
(2)当传入的参数为1的时候,首先程序执行的是case 1,找到了满足的条件,但是case 1中没有break语句终止,所以继续执行,当执行到case 2时,此时,i是14,遇到大括号(大括号或者分号都可以表示语句条件的结束),程序则停止运行。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
switch语句要配合break使用,否则就会在执行其中一条语句后接着执行后面的所有语句。
当i=1时,正好有case 1;由于在case后面没有break;那么从case 1;开始后面的语句都要执行1+1+8+4正好为14,这里记住你把default:放在了第一句,所以它没有执行,如果把它放在case 1;之后,这句也一样执行。
当i=0时,由于没有case 0;所以应该执行default:因为default:语句是在所有条件都不符合的时候进入执行的,而你又把它放在了第一句的位置,所以进入执行之后它之后的所有语句都要执行。所以0+2+1+8+4正好等于15.

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
夏凡 中级黑马 2013-3-26 20:15:28
8#
本帖最后由 夏凡 于 2013-3-26 20:19 编辑
  1. <strong>//正确的代码如下</strong>
  2. class Demo
  3. {
  4.          public static void main(String[] args)
  5.          {
  6.                  show(0);
  7.                  show(1);
  8.          }        
  9.         public static void show(int i)
  10.          {
  11.                  switch(i)                       //错误在于:switch中的语句后面都丢掉了 break;
  12.                  {        
  13.                         default:
  14.                                  i+=2;break;
  15.                          case 1:
  16.                                  i+=1;break;
  17.                          case 4:
  18.                                  i+=8;break;                 
  19.                          case 2:
  20.                                  i+=4;break;
  21.                  }
  22.                  System.out.println("i="+i);
  23.          }        
  24. }</font>
复制代码
首先,你犯了一个错误:每一个case语句之后都丢掉了 break;
正确的代码运行如下:
show(0): 由于switch中不存在 case 0,故执行 default语句,即i+=2,此时输出i=2
show(1): switch中有 case 1语句,直接执行这个语句,即i+=1,此时输出i=2

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
1:switch
        格式:
        switch (表达式){
        case 表达式里对应的值:
                执行语句;
        break;
        case 表达式里对应的值:
                执行语句;
        break;
        ......
        default:
break你漏了,default可以放在前面

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
首先,你没有写跳出语句,
              这样的情况下,当有对应case的语句时,从该case语句开始,往下所会的case都会执行
                            当没有对应的case语句时,那么就会找到default语句开始,从该语句往下所有的case语句都会执行
       所以在default中是没有隐士的跳出功能的

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马