【问题标题】:Fall-through if default is in middle of switch case?如果默认值位于开关盒的中间,则失败?
【发布时间】:2019-01-03 18:40:32
【问题描述】:

我有一个问题。在 switch 语句中,default 是否经过最后测试,即使它不是最后一个?

如果是这样,在下面的代码sn-p中:

int i = 6;
int a=0, b=0, c=0;
switch (i) 
{
    case 1: 
    a++; 
    case 2: 
    default: 
    case 3: 
    b++; 
    case 6:
    c++; 
}
System.out.println(a + " " + b + " " + c); 

匹配case 6后,增加c的值,既然没有break,会不会回到default呢?

我确实尝试了这段代码,但它似乎没有默认,也没有发生故障。我只是想知道?

【问题讨论】:

    标签: java switch-statement default


    【解决方案1】:

    switch 从匹配 casebreakswitch 语句的结尾进行评估。如果您通过 6,它将输入 6 的大小写并且只做一个增量。但是,如果您输入 7,它将从 default 开始,一直到 switch 结束,执行两个增量。

    【讨论】:

      【解决方案2】:

      除了 switch 语句开头的初始测试之外,没有额外的案例标签测试。一旦i 被switch 语句求值,控制就会转移到case 6: 标签,因为它匹配i。然后依次执行语句,直到 switch 语句结束,或者直到遇到 break 语句。这意味着只有 c 会增加。

      break 语句只会结束整个 switch 语句的执行; break 语句是否存在对重新测试 switch 表达式没有影响,因为重新测试 switch 表达式不会发生。

      如果您希望default 成为输入的大小写标签,那么i 不能与switch 语句的开始 处的任何大小写标签匹配。如果在 switch 语句的开头i99,则bc 都会递增(发生故障)。

      default 标签出现在 case 标签顺序中的位置没有限制,只有在 switch 语句中最多出现一个 default

      【讨论】:

      • ...而且我建议大多数人会在默认情况下不持久的情况下进行双重拍摄,所以在其他地方很难找到它。
      【解决方案3】:

      目前,您的所有案例都将失败,因为没有案例也没有break;,您的切换是有条件地基于i,所以如果您想查看每个案例,您需要更改i .

      使用break; 应该不会对您的案例在您的开关状态中的位置产生任何影响,这也是default 的“案例”

      编辑:正如@Ivan 提到的,如果打算失败,那么你的箱子的位置很重要

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多