繁体   English   中英

在switch语句中,为什么所有的case都被执行了?

[英]In a switch statement, why are all the cases being executed?

我有这个代码和我从这篇文章中得到的switch语句,它工作得非常好:

String getOrdinal(final int day) {
    if (day >= 11 && day <= 13) {
        return "th";
    }
    switch (day % 10) {
        case 1: return "st";
        case 2: return "nd";
        case 3: return "rd";
        default: return "th";
    }
}

但是,如果我将其更改为以下内容,它就会中断,因为除了case 1之外的所有案例都将被执行:

  static String getOrdinal(final int day) {
    StringBuilder ordinalBuilder = new StringBuilder();
    ordinalBuilder.append("<sup>");
    if (day >= 11 && day <= 13) {
        ordinalBuilder.append("th") ;
    }
    switch (day % 10) {
        case 1: ordinalBuilder.append("st");
        case 2: ordinalBuilder.append("nd");
        case 3: ordinalBuilder.append("rd");
        default: ordinalBuilder.append("th");
    }
    ordinalBuilder.append("</sup>");
   return ordinalBuilder.toString();
 }

当我传入2时,这会打印2<sup>ndrdth</sup> 我尝试将构建器更改为缓冲区,但我得到了相同的响应......这可能是一个错误还是我犯了一些错误?

这是您代码中的错误。 你忘了在每个case之后break

switch (day % 10) {
    case 1: ordinalBuilder.append("st"); break;
    case 2: ordinalBuilder.append("nd"); break;
    case 3: ordinalBuilder.append("rd"); break;
    default: ordinalBuilder.append("th"); break;
}

我在这里没有看到任何错误,至少在语言的工作方式中没有。 根据设计, switch语句的行为是它将在与参数匹配的case标签处开始执行语句,然后继续执行直到块的末尾。 所以

switch (x) {
    case 1:
        // do thing 1
    case 2:
        // do thing 2
    case 3:
        // do thing 3
    default:
        // do nothing
}

将做两件事2和3,如果x为2,并且将做的事情1,2,和3中,如果x是1。

要获得您可能正在寻找的行为,请以break结束每个case

switch (x) {
    case 1:
        // do thing 1
        break;
    case 2:
        // do thing 2
        break;
    case 3:
        // do thing 3
        break;
    default:
        // do nothing
        break;
}

(严格来说,最后的break是不必要的,但我经常出于习惯而将其放入)。

你在第一个代码示例中没有这个问题的原因是return就像一个超级break :它与break具有相同的效果,即结束switch块内的执行,但它也结束整个方法的执行。

您需要在每个 switch case 中添加一个“break”语句。 它以前有效,因为您从方法中返回...

休息;” 语句将案例彼此分开,因此为了在特定案例中执行语句,只需在案例结束时立即中断案例。

如果不使用 break 编译器认为它可以继续执行所有情况,直到程序结束。

第一个版本在继续执行 case 语句之前返回。 第二个版本需要休息一下; 语句以获得相同的行为。

幸运的是在 Java 12 上引入了switch 语句,它也引入了

“箭头案例”标签,无需使用 break 语句来防止掉线( source )。

因此,您的代码的现代版本如下所示:

String getOrdinal(final int day) {
    if (day >= 11 && day <= 13) {
        return "th";
    }
    return switch (day % 10) {
        case 1 -> "st";
        case 2 -> "nd";
        case 3 ->  "rd";
        default ->  "th";
    };
}

我看到这个问题已经超过 8 年了,但是这个答案应该可以帮助任何登陆此页面的人。

首先让我们了解 switch case 是如何工作的。 在 C、C++、Java、JavaScript 和 PHP 中,在执行 switch 语句时,满足条件之后的所有情况都会被执行,这与 Go 中只执行选定的情况不同。 例如:

public class Main
{
    public static void main(String[] args) {
        int day = 11;
        switch (day % 10) {
            case 1: System.out.println("st"); 
            case 2: System.out.println("nd");
            case 3: System.out.println("rd");
            default: System.out.println("th");
        }
    }
}

当前, day值设置为 11,因此第一个案例满足条件,因此将执行以下所有案例。 输出应如下所示:

st                                                                                                                                                                           
nd                                                                                                                                                                           
rd                                                                                                                                                                           
th 

现在让我们将day值更改为 13 导致第三种情况满足条件,因此获得以下输出:

rd
th

因此,如果您想在找到第一个令人满意的案例后打破代码,那么放置break; 最后的条件。 在问题return;提到的代码中return; 做破坏代码的工作。

此外,大多数新手 Java 程序员认为 SWITCH 语句是 IF 语句的语法糖,程序员不必重复提及条件。 但事实并非如此,因为 IF 的目的是在满足条件执行后退出,而 SWITCH 仍继续执行。

可以利用开关盒来实现以下示例中提到的目的:
其中
A级“优秀!” 应该打印
对于 B 级和 C 级,应打印“做得好”
对于 D 级“你通过了\\n 下次努力”应该打印
对于 F 级,应打印“下次努力”
如果不是一个有效的案例,即发现等级,则应打印“无效等级”。

public class Test {

   public static void main(String args[]) {
      // char grade = args[0].charAt(0);
      char grade = 'C';

      switch(grade) {
         case 'A' :
            System.out.println("Excellent!");
            break;
         case 'B' :
         case 'C' :
            System.out.println("Well done");
            break;
         case 'D' :
            System.out.println("You passed");
         case 'F' :
            System.out.println("Try hard next time");
            break;
         default :
            System.out.println("Invalid grade");
      }
      System.out.println("Your grade is " + grade);
   }
}

在每种情况下,在每一行的末尾添加一个 break 语句,或者只使用 return 语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM