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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马杜鹏 中级黑马   /  2012-11-15 12:18  /  2016 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马杜鹏 于 2012-11-15 17:09 编辑

书上的练习题,问下面程序的运行结果:
public class LX{
        public static void main(String[] args){
                int x=1,y=2,i=0,j=0;
                switch(x){
                        case 1:
                             switch(y){
                                     case 1:i++;break;
                                     case 2:j++;break;
                                     default:i++;j++;
                            }
                         case 2:
                                         i++;j++;break;
                         default:i++;j++;
                        }
                        System.out.println("i="+i);
                        System.out.println("j="+j);
                }
}
//输出结果 i=1    j=2   ,没怎么看懂?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

3 个回复

正序浏览
本帖最后由 金鑫 于 2012-11-15 13:32 编辑

switch(x){  //因为x=1,所以进入case:1
                        case 1:
                             switch(y){  //y=2,所以case1的switch继续跳,进入case 2
                                     case 1:i++;break;
                                     case 2:j++;break;  //程序跳入了这里,j++,所以j = 1
                                     default:i++;j++;
                            }
                         case 2:  //因为case1里没有break关键字,所以执行完case1之后,会继续执行case 2,这种现象也叫break穿透
                                         i++;j++;break;  //程序跳入这里,i++之后,i = 1; 因为在第一个case里面,j的值是1,所以这里j++, j = 2;这里有了break,程序执行完后就跳出,最终结果是i = 1, j = 2;
                         default:i++;j++;
                        }
                        System.out.println("i="+i);
                        System.out.println("j="+j);
                }
}


普通switch:
switch(x){
  case 1:
         表达式;
         break;
  case 2:
        表达式;
         break;
case 3:
       表达式;
        break;
default:
       表达式;
}
因为以上的case里面有break关键字,所以switch只会执行一个case中的表达式,或者执行default中的表达式。

switch穿透: 因为case中没有break,所以会一直执行表达式1,表达式2,表达式3,表达式4直到default中的break来结束switch。如果switch中没有break,那么就会把switch中所有的表达式全部执行,直到程序结束。
switch(x)
{
   case 1:
    表达式1;
  case 2:
        表达式2;
case 3:
       表达式3;
default:
       表达式4;
       break;
}

评分

参与人数 3技术分 +2 黑马币 +1 收起 理由
欧阳亚嗣 + 1 解释的好详细
冯海霞 + 1
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
switch(int x){
  case 1:
         表达式;break;
  case 2:
        表达式;break;
case 3:
       表达式;break;
default:
       表达式;
}
而你的程序中
switch(x){
                        case 1:
                             switch(y){
                                     case 1:i++;break;
                                     case 2:j++;break;
                                     default:i++;j++;
                            }
                         case 2:
                                         i++;j++;break;
                         default:i++;j++;
                        }
case 1后没有break,它会继续往下执行,
case 1:
                             switch(y){
                                     case 1:i++;break;
                                     case 2:j++;break;
                                     default:i++;j++;
                            }
中 因为y=2;所以执行case 2:j++;break;
此时i=0;j=1
然后再执行:
case 2:
                                         i++;j++;break;
此时i=1;j=2
所以不正确,需要
case 1:
                             switch(y){
                                     case 1:i++;break;
                                     case 2:j++;break;
                                     default:i++;j++;
                            };break;

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为case1:的语句后面没有加break,所以会继续执行case2:。

把case1换成  case 1:
                              switch(y){
                                      case 1:i++;break;
                                      case 2:j++;break;
                                      default:i++;j++;
                             }break;//句末加上break试试,这是你想要的结果
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马