3
class switch1
{
    public static void main(String args[])
    {
        int a = 10;
        switch(a)
        {
            default: System.out.println("Default");
            case -1: System.out.println("-1");
        }
    }
}

我知道这个程序将同时执行“默认”和“case -1”语句,因为在匹配条件之后没有指定中断(在这种情况下是在“默认”之后)。

但我不明白的是

a) 为什么break需要在switch声明中?

b)如果它所做的只是匹配,为什么它甚至执行无效匹配条件的语句(即执行“case -1”))?

4

9 回答 9

14

有时您需要多个案例来执行相同的功能。例如,我让用户指定模式 1 或模式 32 代表 32 位模式,模式 2 或模式 64 代表 64 位模式。

switch (input) {

    case 1:
    case 32:
        /* Do 32-bit related code */
        break;
    case 2:
    case 64:
        /* Do 64-bit related code */
        break;
    default:
        System.out.println("Invalid input");

}

这就是为什么休息很重要。它们告诉 switch 语句何时停止执行给定场景的代码。此外,默认值通常用于当开关不匹配任何大小写时。

于 2013-08-22T04:30:13.533 回答
4

switch没有 s 的语句break可以让你做这样的事情:

// Compute the most significant bit set in a number from 0 to 7
int topBit = -1;
switch(n) {
case 0:
    topBit = 0;
    break;
case 1:
    topBit = 1;
    break;
case 2:
case 3:
    topBit = 2;
    break;
case 4:
case 5:
case 6:
case 7:
    topBit = 3;
    break;
}

本质上,它允许您创建一组标签,并在顶部有一个条件让您跳转到初始标签一次。之后,继续执行直到 a break,或到达switch. 这种技术很古老——它从汇编时代就已经存在,并且由于被包含在 C 中,它已经进入了 Java 和其他几种语言。

于 2013-08-22T04:34:10.977 回答
1

至于 a.,要求使用break允许速记符号,其中通用代码可以放在底部块中。在某些情况下,这可能会使代码更具可读性。

有关 fallthrough 的更多信息,请参阅“ C# 中的 Switch 语句 fallthrough? ”。

至于 b.,因为它匹配default大小写,所以执行该行。因为 nobreak存在于该块中,所以无论匹配如何,都会执行下一行。

尝试

switch (a)
{
    case 10: System.out.println("This is 10.");
    case 9 : System.out.println("This is 9.");
             break;
    case 8 : System.out.println("This is 8.");
             break;
    default: System.out.println("Default");
}

因为在匹配的情况下没有中断,所以输出是

This is 10.
This is 9.

将此与设置a为 11、9 或 8 进行比较。

于 2013-08-22T04:30:02.797 回答
1

a) 为什么 switch 语句严重依赖 break 语句来实现其目的?

因为那是他们定义它的方式。它是从 C 复制而来的。Pascal 没有失败,所以它也没有中断。它还具有 Java 所缺乏的 case 范围。允许语言不同。或者一样。

b)为什么它甚至执行无效匹配条件的语句(即执行“case -1”))

因为这就是他们定义它的方式,如果你不休息,就会失败。

如果它所做的只是匹配?

我不明白这个问题。它不做匹配。它会索引跳转到相关案例,如果您不休息,则会进入下一条语句。

于 2013-08-22T06:15:03.403 回答
1

break 语句是必要的,因为没有它们,switch 块中的语句就会失败:匹配 case 标签之后的所有语句都按顺序执行,无论后续 case 标签的表达式如何,直到遇到 break 语句。

检查此文档:http ://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

于 2013-08-22T04:28:26.860 回答
1

声明的Java语言规范部分break

break 语句将控制权转移到封闭语句之外。

和...

一个 break 语句......总是突然完成

a) 它只是允许将控制权转移到 case 语句之外。

b)它执行与您期望匹配的条件不同的原因是因为在某些特定条件下,通过 case 语句将被视为有效(取自The Java Tutorials):

List<String> futureMonths = new ArrayList<String>();
int month = 8;
switch (month) {
    case 1:  futureMonths.add("January");
    case 2:  futureMonths.add("February");
    case 3:  futureMonths.add("March");
    case 4:  futureMonths.add("April");
    case 5:  futureMonths.add("May");
    case 6:  futureMonths.add("June");
    case 7:  futureMonths.add("July");
    case 8:  futureMonths.add("August");
    case 9:  futureMonths.add("September");
    case 10: futureMonths.add("October");
    case 11: futureMonths.add("November");
    case 12: futureMonths.add("December");
             break;
    default: break;
}

for (String monthName : futureMonths) {
    System.out.println(monthName);
}

哪个输出:

八月

九月

十月

十一月

十二月

于 2013-08-22T04:37:18.043 回答
0

如果将 break 添加到循环中,它将取消循环。因此,对于 switch 语句,它会转到正确的情况,一旦出现,它就会执行代码,直到break它退出 switch statemnt。如果您删除了休息,它将继续下一个case,直到看到休息。如果没有break;,代码将崩溃。

所以基本上它区分了不同的情况

于 2013-08-22T04:31:13.570 回答
0

a) 为什么会掉线/需要中断开关?

失败行为在某些情况下很有用,但问题是在常见情况下它是额外的工作。因此,可以合理地预期在更现代的语言中不需要“break”关键字

那么它为什么会存在呢?为了匹配 C++(设计 Java 时的主导语言)的行为,它再次匹配 C(设计 C++ 时的主导语言)的行为。至于 C,它(以及 B 和 BCPL,它的前身)通常看起来是为了更容易构建一个高效的编译器。基本上 switch 语句的工作方式是在汇编程序中实现它的自然方式。

b) 它的行为方式在逻辑上遵循使用fall-through 的决定。

于 2013-08-22T05:55:40.743 回答
0

在 Switch 案例中,关注点是 break 语句。

每个 break 语句都会终止封闭的 switch 语句。控制流继续 switch 块之后的第一条语句。break 语句是必要的,因为没有它们,switch 块中的语句就会失败:匹配 case 标签之后的所有语句都按顺序执行,无论后续 case 标签的表达式如何,直到遇到 break 语句。

程序 SwitchDemoFallThrough 显示了 switch 块中的语句。该程序显示对应于整数月份的月份和一年中的月份:

公共类 SwitchDemoFallThrough {

public static void main(String[] args) {
    java.util.ArrayList<String> futureMonths =
        new java.util.ArrayList<String>();

    int month = 8;

    switch (month) {
        case 1:  futureMonths.add("January");
        case 2:  futureMonths.add("February");
        case 3:  futureMonths.add("March");
        case 4:  futureMonths.add("April");
        case 5:  futureMonths.add("May");
        case 6:  futureMonths.add("June");
        case 7:  futureMonths.add("July");
        case 8:  futureMonths.add("August");
        case 9:  futureMonths.add("September");
        case 10: futureMonths.add("October");
        case 11: futureMonths.add("November");
        case 12: futureMonths.add("December");
                 break;
        default: break;
    }

    if (futureMonths.isEmpty()) {
        System.out.println("Invalid month number");
    } else {
        for (String monthName : futureMonths) {
           System.out.println(monthName);
        }
    }
}

}

这是代码的输出:

八月 九月 十月 十一月 十二月

从技术上讲,最后的中断不是必需的,因为 flow 不在 switch 语句中。建议使用中断,以便修改代码更容易且不易出错。默认部分处理未由 case 部分之一显式处理的所有值。

在此处查看有关开关的完整信息

于 2013-08-22T04:37:02.943 回答