黑马程序员技术交流社区

标题: 运算问题 [打印本页]

作者: 宋耀冬    时间: 2013-3-26 14:37
标题: 运算问题
本帖最后由 宋耀冬 于 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);
        }        
}

这段代码是怎么执行的   我自己算的结果个打印的完全不同啊
作者: 祁振朋    时间: 2013-3-26 14:55
switch里没有break,所以,当i=0时,default,case1,case2,case4全都执行了。所以show(0)=15
当i=1的时候,default就不执行了。所以结果是14
作者: 李晓峰    时间: 2013-3-26 15:18
switch语句结束有两种情况:1.遇到break;2.执行到switch语句结束。你的代码中没有break;因此会执行到switch语句结束,所以结果为:show(0);//15;show(1);//14
作者: 刘焕新    时间: 2013-3-26 15:32
case语句里少了break语句,直接穿透了!
作者: 曾祥旭    时间: 2013-3-26 15:41
本帖最后由 曾祥旭 于 2013-3-26 19:18 编辑

这个好像毕老师的教学视频中讲到这个问题了吧?

作者: 曾祥旭    时间: 2013-3-26 15:42
(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,遇到大括号(大括号或者分号都可以表示语句条件的结束),程序则停止运行。
作者: 陆旭东    时间: 2013-3-26 18:43
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.
作者: 夏凡    时间: 2013-3-26 20:15
本帖最后由 夏凡 于 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


作者: 梁志兵    时间: 2013-3-26 21:15
1:switch
        格式:
        switch (表达式){
        case 表达式里对应的值:
                执行语句;
        break;
        case 表达式里对应的值:
                执行语句;
        break;
        ......
        default:
break你漏了,default可以放在前面
作者: 余善航    时间: 2013-3-26 22:13
首先,你没有写跳出语句,
              这样的情况下,当有对应case的语句时,从该case语句开始,往下所会的case都会执行
                            当没有对应的case语句时,那么就会找到default语句开始,从该语句往下所有的case语句都会执行
       所以在default中是没有隐士的跳出功能的




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