【问题标题】:switch statement with an default clause at the beginning java在 java 开头带有 default 子句的 switch 语句
【发布时间】:2015-01-12 22:43:03
【问题描述】:

以下代码打印出1,2,3,如果我更改int i = 3;,它将打印出3。我想知道这背后的原因。我使用了调试器,似乎i = 3 转到案例 3 并打印出 3 然后程序终止。我相信当 i=5 转到 default 时,这是否意味着 case 1,case 2 and case 3 都属于 default条款?

int i = 5;
switch(i){
default:
case 1:
    System.out.println(1);
case 2:
    System.out.println(2);
case 3:
    System.out.println(3);

}

编辑: 这个问题来自一个测试,它要求这个代码的输出。所以我想弄清楚为什么输出是1,2,3,我知道需要break;,但这不是我想要的答案。

【问题讨论】:

  • 你需要break;在每个case的末尾声明,否则执行将/* fall through */到它下面的case。
  • @rgettman 感谢您的提醒,但这不是我的问题,我离开了'break;'故意为这个问题而出的。
  • 事实上,确实如此。 break 语句的缺失完全解释了您的输出,以及为什么有些案例似乎“属于”其他案例。
  • 那么请重新插入。 breaks 在这里是必不可少的。
  • “属于默认子句”并不是一个真正有意义的事情。事物不属于从句;只是switch可以去的地方,default的情况是在开头。

标签: java switch-statement default


【解决方案1】:
  • i == 5 与您的任何cases 都不匹配,因此控制权转到default 子句。

  • default 子句是空的,没有break 语句,它立即将falls through 指向下面的case — 您的代码中的case 1

  • case 1 打印出"1",并且由于它也没有break 语句,因此会落入case 2,依此类推。


cases 1, 2, 3 不属于 default——重要的是他们的顺序。

如果您重新排序您的开关statement 并将default 子句写为最后一个子句,它不会打印任何内容。

【讨论】:

    【解决方案2】:

    如果您在任何情况下都没有中断或默认设置,它将失败,直到找到中断或案例块结束。因此,在您的情况下,由于您没有默认中断,因此一直到最后。如果不中断,您的程序将为 i>3 打印 1,2,3。

    【讨论】:

    • 是的@5gon12eder 你是对的我已经删除了always。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 2012-04-27
    • 2018-05-05
    • 2011-12-27
    • 1970-01-01
    相关资源
    最近更新 更多