class switch1
{
public static void main(String args[])
{
int a = 10;
switch(a)
{
default: System.out.println("Default");
case -1: System.out.println("-1");
}
}
}
据我所知,该程序将执行“default”和“case -1”语句,因为在匹配条件之后未指定break(在本例中是“default”之后)。
但我不明白的是
a)为什么break
声明需要switch
?
b)为什么它甚至执行无效的匹配条件的语句(即执行“case -1”))如果它只是匹配的话?
答案 0 :(得分:13)
有时您需要多个案例才能执行相同的功能。例如,我让用户指定模式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语句何时停止执行给定方案的代码。此外,默认设置通常用于开关与任何情况不匹配时。
答案 1 :(得分:3)
switch
的 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;
}
基本上,它允许您创建一组标签,并在顶部有一个条件,让您跳转到初始标签一次。之后,执行将持续到break
,或者到达switch
的末尾。这种技术已经很久了 - 它自组装时间开始就已存在,并且由于被包含在C中,它已经进入Java和其他几种语言。
答案 2 :(得分:1)
break语句是必要的,因为没有它们,switch块中的语句都会失败:匹配的case标签之后的所有语句都按顺序执行,而不管后续case标签的表达式,直到遇到break语句。
请查看此文档:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
答案 3 :(得分:1)
对于a。,要求使用break
允许使用简写符号,其中公共代码可以放在底部块。在某些情况下,这可能会使代码更具可读性。
有关详细信息,请参阅“Switch statement fallthrough in C#?”。
至于b。,因为它匹配default
情况,所以执行该行。由于该块中不存在break
,因此无论匹配如何,都会执行下一行。
尝试
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进行比较。
答案 4 :(得分:1)
来自Java Language Specification section on the break
statement:
break语句将控制转移到封闭语句之外。
和...
休息声明......总是突然完成
a)它只允许将控制转移出case语句。
b)它执行不符合预期匹配条件的原因是因为有一些特殊情况下,通过案例陈述被认为是有效的(取自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);
}
哪个输出:
八月
9月 十月 11月腊
答案 5 :(得分:1)
a)为什么switch语句在很大程度上依赖于break语句来实现其目的?
因为这是他们定义它的方式。它是从C.复制的。帕斯卡没有堕落,所以它也没有中断。它还有Java缺乏的案例范围。语言允许不同。或者相同。
b)为什么它甚至执行无效的匹配条件的语句(即执行“case -1”))
因为这是他们定义它的方式,如果你没有休息,可以通过实践。
如果一切都匹配?
我不明白这个问题。它不匹配。它会对相关案例进行索引跳转,如果你没有休息,则会跳到下一个语句。
答案 6 :(得分:0)
如果将break添加到循环中,它将取消循环。所以对于一个switch语句,它会转到正确的大小写,一旦它在那里它执行代码,直到break
然后它将退出switch statemnt。如果你删除了它,它会继续到下一个case
直到看到休息。如果没有break;
,代码将崩溃。
所以基本上它将不同的情况分开
答案 7 :(得分:0)
在Switch案例中,兴趣点是break语句。
每个break语句都会终止封闭的switch语句。 控制流继续切换后的第一个语句 块。 break语句是必要的,因为没有它们, switch块中的语句落在:所有语句之后 匹配的案例标签按顺序执行,无论如何 后续case标签的表达式,直到break语句为止 遇到。
程序SwitchDemoFallThrough显示掉落的交换机块中的语句。该程序显示对应于整数月份的月份以及该年度中的月份:
公共类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语句。建议使用中断,以便更容易修改代码并减少错误。默认部分处理其中一个案例部分未明确处理的所有值。
在此处查看有关switch
的完整信息答案 8 :(得分:0)
a)为什么在开关中出现跌倒/要求中断?
在某些情况下,跌倒行为很有用,但问题在于它在常见情况下是额外的工作。因此,期望在更现代的语言中不需要“break”关键字是合理的
那为什么呢?为了匹配C ++(Java设计时的主导语言)的行为,它再次匹配C的行为(C ++设计时的主导语言)。至于C,它(以及B和BCPL,它的前身)通常看起来像它可以更容易地构建一个有效的编译器。基本上switch语句的工作方式是在汇编程序中实现它的自然方式。
b)它的行为方式逻辑上遵循决定使用堕落。