JAVA 基础 switch 执行顺序的问题

si1ence4010 2017-04-12 11:27:29
最初的问题:
public class Test_A {
public static void main(String[] args) {
int i=1, j=0;
switch(i) {
case 2:
j+=6;
case 4:
j+=1;
default:
j +=2;
case 0:
j +=4;
}
System.out.println("j="+j);
}
}


打印:j=6;
问: 进入switch后,程序是怎么样运行的(执行机制?),是从上到下一次比较执行还是直接跳到 case 1:那里?

之后想到了另一个问题,将default 后的 case 0 改为 case 1,结果会是怎么样的
public class Test_A {
public static void main(String[] args) {
int i=1, j=0;
switch(i) {
case 2:
j+=6;
case 4:
j+=1;
default:
j +=2;
case 1:
j +=4;
}
System.out.println("j="+j);
}
}


打印:j=4;
这表明 没有 进入 default

综上:swtich的运行机制是怎么样的,不是从上到下依次执行 么 还是怎么样的。
...全文
682 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwe132052 2017-04-17
  • 打赏
  • 举报
回复
引用 17 楼 qwe132052 的回复:
[quote=引用 11 楼 si1ence4010 的回复:] [quote=引用 4 楼 qwe132052 的回复:] 1.输出6是因为没加break。switch里的代码不加break,就会一只执行下去,你如果i=2,全都会加一遍,输出13 2.另外,顺序是从上往下执行,case其实相当于if,如果是就从这里执行,没有break就继续往下执行,但是不会在执行case判断,而是执行实体 如果要写几个case一样执行,最好是不加实体,这样看起来清晰些,比如下面,1和2都是一样执行 case 1: case 2: j +=4; break; default: j +=2; break;
谢谢,你说的这个 我是了解的。如果是从上到下执行,那么 我的 第二段代码中,执行到default时会执行default 中 的 代码 吗[/quote] 当然会啊,你不要在意是不是default,你可以认为Default也是case的一种,把他当成case看,只是他的条件是 case:(前面的人没有的) 这样是不是就明白了?[/quote] 我又说错了,不是case:(前面的人没有的),是case(其他人没有的),不管前面后面
qwe132052 2017-04-17
  • 打赏
  • 举报
回复
引用 11 楼 si1ence4010 的回复:
[quote=引用 4 楼 qwe132052 的回复:] 1.输出6是因为没加break。switch里的代码不加break,就会一只执行下去,你如果i=2,全都会加一遍,输出13 2.另外,顺序是从上往下执行,case其实相当于if,如果是就从这里执行,没有break就继续往下执行,但是不会在执行case判断,而是执行实体 如果要写几个case一样执行,最好是不加实体,这样看起来清晰些,比如下面,1和2都是一样执行 case 1: case 2: j +=4; break; default: j +=2; break;
谢谢,你说的这个 我是了解的。如果是从上到下执行,那么 我的 第二段代码中,执行到default时会执行default 中 的 代码 吗[/quote] 当然会啊,你不要在意是不是default,你可以认为Default也是case的一种,把他当成case看,只是他的条件是 case:(前面的人没有的) 这样是不是就明白了?
ljheee 2017-04-15
  • 打赏
  • 举报
回复
输出6是因为没加break。switch里的代码不加break,就会一只执行下去
Sun_shine_nice 2017-04-14
  • 打赏
  • 举报
回复
确定没错吗?case都没命中的话就直接default了,之后就结束了。命中了case会再走default。
galiniur0u 2017-04-13
  • 打赏
  • 举报
回复
switch是case进行条件判断,当条件满足时,才会进入到该条件内的程序块执行,但进入某段条件后,就需要对其进行break跳出,如果不跳出,会执行之后所有case中的语句。也就是说,当达到某个条件后除非遇到break或者switch结束,否则就会执行这个case后的所有代码。
MikeDDT009 2017-04-13
  • 打赏
  • 举报
回复
引用 12 楼 si1ence4010 的回复:
[quote=引用 8 楼 MikeDDT009 的回复:] 简单来说里面每个匹配里面的break都没有,所以直接跳到匹配的case语句依次往下运行,里面不管你怎么排,也就是顺序不管,只找匹配的,没有匹配的就走defaullt语句,而deafult里面没有break的话就顺序走,而往下的过程每次都改变了j的值
谢谢。那他是怎么知道 哪一个case语句是匹配的呢,从上到下依次比较?[/quote] 想知道这程序具体怎么运行你需要debug测试走一遍就一目了然了
si1ence4010 2017-04-13
  • 打赏
  • 举报
回复
引用 8 楼 MikeDDT009 的回复:
简单来说里面每个匹配里面的break都没有,所以直接跳到匹配的case语句依次往下运行,里面不管你怎么排,也就是顺序不管,只找匹配的,没有匹配的就走defaullt语句,而deafult里面没有break的话就顺序走,而往下的过程每次都改变了j的值
谢谢。那他是怎么知道 哪一个case语句是匹配的呢,从上到下依次比较?
si1ence4010 2017-04-13
  • 打赏
  • 举报
回复
引用 4 楼 qwe132052 的回复:
1.输出6是因为没加break。switch里的代码不加break,就会一只执行下去,你如果i=2,全都会加一遍,输出13 2.另外,顺序是从上往下执行,case其实相当于if,如果是就从这里执行,没有break就继续往下执行,但是不会在执行case判断,而是执行实体 如果要写几个case一样执行,最好是不加实体,这样看起来清晰些,比如下面,1和2都是一样执行 case 1: case 2: j +=4; break; default: j +=2; break;
谢谢,你说的这个 我是了解的。如果是从上到下执行,那么 我的 第二段代码中,执行到default时会执行default 中 的 代码 吗
si1ence4010 2017-04-13
  • 打赏
  • 举报
回复
引用 3 楼 pany1209 的回复:
[quote=引用 2 楼 si1ence4010 的回复:] [quote=引用 1 楼 pany1209 的回复:] 第一个i没有匹配,进入default,default里面又没有break;从上往下执行直到遇到break;所以是6 第二个直接命中1,没有break;不过下面也没有代码了所以是4
第一句:他是怎么判断没有匹配值的,是先判断 i !=2 ,在 i !=4.。。。这样一次判断吗 第二句: 为什么会 直接 命中1呢 ? 难道它知道 有 case 1 这个选项吗? 他是怎么知道 有 case 1 这个选项的 谢谢[/quote] http://blog.csdn.net/cleanfield/article/details/6224769 http://blog.csdn.net/wenpinglaoyao/article/details/51099553 参考一下。。。[/quote]谢谢,虽然还有些看不懂,不过大体是我问题的 解答。谢谢
李德胜1995 2017-04-12
  • 打赏
  • 举报
回复
引用 2 楼 si1ence4010 的回复:
[quote=引用 1 楼 pany1209 的回复:] 第一个i没有匹配,进入default,default里面又没有break;从上往下执行直到遇到break;所以是6 第二个直接命中1,没有break;不过下面也没有代码了所以是4
第一句:他是怎么判断没有匹配值的,是先判断 i !=2 ,在 i !=4.。。。这样一次判断吗 第二句: 为什么会 直接 命中1呢 ? 难道它知道 有 case 1 这个选项吗? 他是怎么知道 有 case 1 这个选项的 谢谢[/quote] http://blog.csdn.net/cleanfield/article/details/6224769 http://blog.csdn.net/wenpinglaoyao/article/details/51099553 参考一下。。。
si1ence4010 2017-04-12
  • 打赏
  • 举报
回复
引用 1 楼 pany1209 的回复:
第一个i没有匹配,进入default,default里面又没有break;从上往下执行直到遇到break;所以是6 第二个直接命中1,没有break;不过下面也没有代码了所以是4
第一句:他是怎么判断没有匹配值的,是先判断 i !=2 ,在 i !=4.。。。这样一次判断吗 第二句: 为什么会 直接 命中1呢 ? 难道它知道 有 case 1 这个选项吗? 他是怎么知道 有 case 1 这个选项的 谢谢
李德胜1995 2017-04-12
  • 打赏
  • 举报
回复
第一个i没有匹配,进入default,default里面又没有break;从上往下执行直到遇到break;所以是6 第二个直接命中1,没有break;不过下面也没有代码了所以是4
灰机会灰 2017-04-12
  • 打赏
  • 举报
回复
switch(i) 语句中case j 就是判断按顺序判断, i是否等于j 如果等于就执行此行语句。 语句中如果没有break就继续执行到结束, 如果有就直接跳出 。
MikeDDT009 2017-04-12
  • 打赏
  • 举报
回复
简单来说里面每个匹配里面的break都没有,所以直接跳到匹配的case语句依次往下运行,里面不管你怎么排,也就是顺序不管,只找匹配的,没有匹配的就走defaullt语句,而deafult里面没有break的话就顺序走,而往下的过程每次都改变了j的值
编程点滴 2017-04-12
  • 打赏
  • 举报
回复
对应的字节码


public static void main(java.lang.String[]);
  Code:
   0:   iconst_1
   1:   istore_1
   2:   iconst_0
   3:   istore_2
   4:   iload_1
   5:   tableswitch{ //1 to 4
                1: 45;
                2: 36;
                3: 42;
                4: 39;
                default: 42 }
   36:  iinc    2, 6
   39:  iinc    2, 1
   42:  iinc    2, 2
   45:  iinc    2, 4
   48:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   51:  new     #3; //class java/lang/StringBuilder
   54:  dup
   55:  invokespecial   #4; //Method java/lang/StringBuilder."<init>":()V
   58:  ldc     #5; //String j=
   60:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   63:  iload_2
   64:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   67:  invokevirtual   #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   70:  invokevirtual   #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   73:  return

}
从字节码看,default 被放到最后了
hhfire 2017-04-12
  • 打赏
  • 举报
回复
没有break的时候,会从你传进来的参数相应的case下依次执行,按照这个原理得出答案不难吧
110成成 2017-04-12
  • 打赏
  • 举报
回复
第一个 ,没有匹配到,直接执行default,所以j=2, 因为没有break,接着往下执行,所以j=6 第二个,i=1 匹配到,所以j=4,虽然没有break,但是后面也没有了,所以结束 一般swich写的话,都要加上break。
qwe132052 2017-04-12
  • 打赏
  • 举报
回复
1.输出6是因为没加break。switch里的代码不加break,就会一只执行下去,你如果i=2,全都会加一遍,输出13 2.另外,顺序是从上往下执行,case其实相当于if,如果是就从这里执行,没有break就继续往下执行,但是不会在执行case判断,而是执行实体 如果要写几个case一样执行,最好是不加实体,这样看起来清晰些,比如下面,1和2都是一样执行 case 1: case 2: j +=4; break; default: j +=2; break;

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧