黑马程序员技术交流社区

标题: 重新复习switch,又乱了。<已解决> [打印本页]

作者: 李月    时间: 2012-6-4 10:05
标题: 重新复习switch,又乱了。<已解决>
本帖最后由 李月 于 2012-6-5 09:39 编辑
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                
  6.                 show(1);//14
  7.         }        
  8.         public static void show(int i)
  9.         {
  10.                 switch(i)
  11.                 {        
  12.                         default:
  13.                                 i+=2;
  14.                         case 1:
  15.                                 i+=1;
  16.                         case 4:
  17.                                 i+=8;                        
  18.                         case 2:
  19.                                 i+=4;
  20.                 }
  21.                 System.out.println("i="+i);
  22.         }        
  23. }
复制代码

最后结果为什么是14呢?
谁能帮我屡1屡,说说程序执行的顺序。

作者: 梁小波    时间: 2012-6-4 10:11
从case1开始因为没有break吗!所以顺序执行
case 1:
            i+=1;//2
  case 4:
             i+=8;   //10                    
case 2:
           i+=4;//14
就ok;累了就休息一下吗。换一下脑子
作者: 陆建平    时间: 2012-6-4 10:15
没有break语句,show(1);执行case1:i+=1;结果i=2;因为没有break语句,所以后面的case语句不用判断直接执行,接下来的执行顺序将是case4:i+=8; case2:i+=4;接下来执行输出语句System.out.println("i="+i);default:在case1之前将不会执行到。如果show(0);将执行default以及后面的语句,没有break将会从执行的那个开始按顺序执行所有语句,除非遇到跳转语句。
作者: 何旭栋    时间: 2012-6-4 10:32
没有加break,会一直往下读代码
作者: 张文建    时间: 2012-6-4 10:37
case的执行顺序:
                         表达式为i=1 case的值分别为 1 4 2
一:先找是否有符合表达式i=1的case语句
有,则执行case1的语句,并且不执行第一个default语句
二:case2语句中没有break语句,执行完该句就执行其他下一句,它不往回执行前一case语句)case语句直到break为止。
三:执行case4语句:i+=1-->i=2-->i+=8-->i=10
四:执行case2语句:i+=4-->i=14
至此没有break语句,则执行default语句
default语句中没有break语句,则执行其他case语句,case语句直到break为止。
default语句有break语句,则在执行完该句就跳出循环。
大家不妨在思考一下:
我把代码改了一下:
01.class Demo

02.{

03.        public static void main(String[] args)

04.        {

05.               

06.                show(1,0);//当j=1时的结果和j=2时的结果一样吗,为什么?

07.        }        

08.        public static void show(int  j,int i)

09.        {

10.                switch(j)

11.                {        

12.                        default:

13.                                i+=2;

14.                        case 1:

15.                                i+=1;

16.                        case 4:

17.                                i+=8;                        

18.                        case 2:

19.                                i+=4;

20.                }

21.                System.out.println("i="+i);

22.        }        

23.}



作者: 包晗    时间: 2012-6-4 12:06
switch语句,即“切换”语句;case即“情况”(毕老师的解释说:小case 就是小事情)。
break作用是跳出case. 在你完成了想要的代码后
加上break 跳出去 ,
没有break就是顺序执行
default就是如果没有符合的case就执行它,
个人理解   这个  default  可有可无 并不是必须的.
希望对你有帮助
作者: 李春阳    时间: 2012-6-4 13:10
楼主switch格式没问题~但是忘加break关键字了~
因而switch语句会从case 1: 开始依次加载执行下面的case~
因而最终结果为1 + 1+8+4 = 14。

修改为:
public static void show(int i)

        {

                switch(i)

                {        

                        default:

                                i+=2;
                                break;

                        case 1:

                                i+=1;
                                break;

                      case 4:

                                i+=8;   
                                break;                     

                        case 2:

                                i+=4;

                }

                System.out.println("i="+i);

        }        

作者: 邹海洋    时间: 2012-6-4 15:27
哥们忘了加break ;就这么简单。建议回去看下视频 ,执行顺序的问题。
作者: 麦田守望者0812    时间: 2012-6-4 15:32
class Demo
{
        public static void main(String[] args)
        {
               
                show(1);//14
        }        
        public static void show(int i)
        {
                switch(i)
                {        
                        default:
                                i+=2;
                        case 1:
                                i+=1;   首先执行该 代码      i=2    因为case后 没有break 会接着执行下面
                        case 4:
                                i+=8;     第二  i = 10 同上 继续执行下面                  
                        case 2:
                                i+=4; 第三 i =14 执行下面
                }
                System.out.println("i="+i); 打印 i=14
        }        
}
复制代码
作者: liumeng    时间: 2012-6-4 15:49
default 为什么放在后边
作者: 郭永岳    时间: 2012-6-4 17:10
首先,你要先了解switch语句的用法。
switch(表达式)
{
  case 常量表达式1:语句1; break;
  ....
  case 常量表达式n:语句n; break;
  default:语句;break;
}
1、default就是如果没有符合的case就执行它,default并不是必须的.
2、case后的语句可以不用大括号.
3、switch语句的判断条件可以接受int,byte,char,short,枚举,不能接受其他类型.
4.、都没有break 语句的情况下:首先会在所有的case 语句中,寻找满足条件的语句。如果找到,会从该语句顺序向下执行每个语句;若找不到,会从第一段开始,向下顺序执行每一段语句。
5、在有break 语句的情况下:首先找到一个满足条件的case 语句执行,若找不到,会执行default 的语句。

你现在的程序是属于第4点的错误,要理解用法。所以会出现的错误跟一楼所说的现象。

QQ截图20120604170900.jpg (15.83 KB, 下载次数: 53)

QQ截图20120604170900.jpg

作者: 邵阳    时间: 2012-6-4 18:38
刚刚看完毕向东老师讲的第二天课,刚刚将了你说的问题。同为新手我尽可能直白。
1:你的不是标准的switch语句,标准的应该是
switch(表达式)
{
case取值:
执行语句;
break;
case取值:
执行语句;
break;
........
default:
执行语句;
break;
}

2:通过对比你应该发现你的switchi语句和标准的有区别吧。
a、你的default语句放在了最前面,不过这不影响整个运算,因为case和default之间没有顺序,先执行第一个case,没有匹配的case执行default。
b、缺少break。这是造成你运算结果最主要原因,下面重点说明。
3:结束switch语句有两种情况:遇到break,遇到“}“结束。
switch(i)

11.                {        

12.                        default://不执行,因为先执行第一个case

13.                                i+=2;  

14.                        case 1:  //执行case

15.                                i+=1;//因为i+=1相当于i=i+1,又原i=1,经运算后为2

16.                        case 4://执行

17.                                i+=8;       //同理i=i+8.  得i=10                 

18.                        case 2:

19.                                i+=4;      //同理  i=14

20.                }//遇到”}“结束。

  
21.                System.out.println("i="+i);
不知道听懂没,再插一句,“+=”是一个运算符。




作者: 李月    时间: 2012-6-5 09:38
这回我晓得了。谢谢各位的热心帮助。
作者: 武剑峰    时间: 2012-6-5 12:33
呵呵,活用没有break. 也是一种启发,关键看你是否真的明白
来自:黑马程序员训练营论坛 Android客户端




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