黑马程序员技术交流社区

标题: 看着个switch的问题 [打印本页]

作者: heheka123    时间: 2014-4-22 14:41
标题: 看着个switch的问题
  1. class Demo4
  2. {
  3.         public static void main(String[] args)
  4.         {                                 
  5.                 int x = 1,y=2;
  6.                 switch(x)
  7.                 {
  8.                     default:
  9.                             y++;
  10.                     case 2:
  11.                             y++;
  12.                     case 3:
  13.                             y++;

  14.                 }
  15.                 System.out.println("y="+y);               
  16.         }
  17. }
复制代码


打印出来怎么变成:y=5了呢,  我觉得应该是3啊,下面的怎么还执行呢
作者: 二小傻    时间: 2014-4-22 14:44
每一个分支下面添加break;不然会继续执行的
作者: tacyjay在路上    时间: 2014-4-22 14:46
本帖最后由 tacyjay在路上 于 2014-4-22 14:50 编辑

看看这个吧   http://bbs.itheima.com/forum.php ... 29&page=1#pid678556


还是给你贴一下,我的回答吧


switch有两种结束方式,即“break; ”或者“}”,跟case和default位置无关,不过都是从case开始判断读起的。

第一种情况,有default先判断case值,则先读 case 2:  y++;     case3:  y++;  都不满足,所以去执行default: y++;此时y=3;
由于没有遇到“break;”或者“}”,并且还有case2,case3语句没完成,所以运算继续向下执行不再判断case的值,所以执行case 2:  y++;  此时y=4,然后case 3:  y++;  此时y=5,遇到“}”,
结束switch语句,输出y=5.

第二种情况,无default先判断case值,不满足,再到default,没有,直接跳出switch,y不变,输出 y=3.

毕老师day-02-19里讲的很清楚,楼主可以再看看。


作者: 阿旺    时间: 2014-4-22 14:48
switch语句的基本语法:
switch(表达式){
case 常量表达式1: 语句序列1
[break;]
case 常量表达式2: 语句序列2
[break;]
……
case 常量表达式n: 语句序列n
[break;]
default: 语句序列n+1
[break;]
}

作者: wyqs92    时间: 2014-4-22 15:35
因为switch(x)先判断case中有没有x的值,在此段程序中没有,它就去执行default。但是你的代码中没有break语句,程序就继续向下执行了。。
  1. class Demo4
  2. {
  3.         public static void main(String[] args)
  4.         {                                 
  5.                 int x = 1,y=2;
  6.                 switch(x)
  7.                 {
  8.                     default:
  9.                             y++;   //x=3
  10.                     case 2:
  11.                             y++;    //x=4
  12.                     case 3:
  13.                             y++;    //x=5

  14.                 }
  15.                 System.out.println("y="+y);               
  16.         }
  17. }
复制代码

作者: 々白点潜心ザ    时间: 2014-4-22 15:44
switch的结束的标志一共有两种:
1、case中执行完有break;
2、执行到"}",判断结束。

这道题目中首先需要判断x的值,看是否有case 1对应的语句,题目中并没有,所以执行default对应的语句。
在执行完default的语句后,即y++,y自增一个,y=3;
此时,不再对x进行判断而是执行剩下所有的语句,即,y会自增两次,得到y=5;
:)
作者: 千殇轮回    时间: 2014-4-22 16:13
本帖最后由 千殇轮回 于 2014-4-22 16:16 编辑

int x = 1,y=2;
                switch(x)
                {
                    default:
                            y++;//因为没有case和x的值匹配,所以先执行这一语句,y的值就为3
                    case 2:
                            y++;//因为default语句后面没有加break,所以程序继续向下执行,y的值就为4
                    case 3:
                            y++;//因为case 2语句后面没有加break,所以程序继续向下执行,y的值就为5,到了这程序
                                       已经是switch 最后一行,所以switch 执行完毕                        
                              
作者: 黄晓鑫    时间: 2014-4-22 16:31
你加一个输出语句就知道了 先走的case语句 没有默认值 再走default
作者: 彭飞    时间: 2014-4-22 20:44
这个。。。。
因为没有结束语句,所有程序挨个执行了一遍,也就是y++了3次,也就是5咯

楼主对switch 还不够熟悉。
对switch的知识在多看看吧。
作者: 四川男人    时间: 2014-4-23 00:26
class Demo4
{
        public static void main(String[] args)
        {                                 
                int x = 1,y=2;
                switch(x)          //此处x=1,没有匹配到。进入default执行y++,然后y++后面没有break,程序继续执行,
                                        //直到switch代码块儿结束,所以y=5;
                {
                    default:
                            y++;
                    case 2:
                            y++;
                    case 3:
                            y++;

                }
                System.out.println("y="+y);               
        }
}

作者: 爱翚    时间: 2014-4-23 07:50
由于没加break造成了所有y++都被执行了一遍
碰到这种问题如果不理解,我个人的经验是多加几个输出语句,然后就一目了然了。

class Demo4{
        public static void main(String[] args) {
                int x = 1, y = 2;
                switch (x){
                default:
                        System.out.println("defaultheady=" + y);//y=2
                        y++;
                        System.out.println("defaulty=" + y);//y=3
                case 2:
                        System.out.println("case2heady=" + y);//y=3
                        y++;
                        System.out.println("case2y=" + y);//y=4
                case 3:
                        System.out.println("case3heady=" + y);//y=4
                        y++;
                        System.out.println("case3y=" + y);//y=5
                }
                System.out.println("y=" + y);//y=5
        }
}
作者: 雪碧拌米饭    时间: 2014-4-23 08:53
本帖最后由 雪碧拌米饭 于 2014-4-23 08:55 编辑

                        public static void main(String[] args)
                        {                                 
                                int x = 1,y=2;
                                switch(x)
                                {
                                    default:
                                            y++;
                                            break;
                                    case 2:
                                            y++;
                                            break;
                                    case 3:
                                            y++;
                                            break;

                                }
                                System.out.println("y="+y);               
                        }
这样就可以了,少break语句。





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