我只是在我的java代码中遇到一些奇怪的东西:
switch (result) {
case 0:
result_amount = 500;
case 1:
result_amount = 600;
case -1:
result_amount = 700;
}
result
来自原始类型int。
对于值1
,case 1
和case -1
已执行。
这是正常的开关案例行为吗?如果是的话:为什么?
答案 0 :(得分:8)
您需要在break
阻止后使用case
关键字:
switch (result) {
case 0:
result_amount = all_amounts[i];
break;
case 1:
result_amount = all_amounts[i];
break;
case -1:
result_amount = all_amounts[i+1];
}
switch
语句将跳转到正确的case
标记,然后执行后面的所有代码,忽略潜在的其他case
标记。您可以将switch
语句视为goto
语句。
答案 1 :(得分:3)
堕落。
break语句是必要的,因为没有它们,switch块中的语句都会失败:匹配的case标签之后的所有语句都按顺序执行,而不管后续case标签的表达式,直到遇到break语句。
您必须在每个案例后添加break
。
case 1:
result_amount = 600;
break;
答案 2 :(得分:0)
如果没有break
语句,将执行下一个案例。
答案 3 :(得分:0)
这是fall through
条件。
switch (result) {
case 0:
result_amount = all_amounts[i];
case 1:
result_amount = all_amounts[i];
case -1:
result_amount = all_amounts[i+1];
}
为避免这种情况,您必须提出break
声明
switch (result) {
case 0:
result_amount = all_amounts[i];
break;
case 1:
result_amount = all_amounts[i];
break;
case -1:
result_amount = all_amounts[i+1];
break;
}
现在只会执行匹配的案例。
答案 4 :(得分:0)
<强>记住强>:
这是几乎每个初学者都会犯的错误。这就是我更喜欢C#的原因。它不允许“堕落”。
你做错了什么是你倒掉了switch语句。尝试使用0作为result
的值。它会经历所有情况。当switch case完成执行时,下一个case将被执行。这就是为什么我们需要为switch语句的每个case添加一个break;
语句。
switch (result) {
case 0:
result_amount = 500;
break;
case 1:
result_amount = 600;
break;
case -1:
result_amount = 700;
break;
}
但有时我们想要堕落。例如,当我们想要计算一个月内的天数时:
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 2:
days = 28;
case 4:
case 6:
//Lots of code...
}
答案 5 :(得分:0)
您应该包含break和default以正确的方式运行程序。让我举个例子。
switch (result) {
case 0:
result_amount = 500;
break;
case 1:
result_amount = 600;
break;
case -1:
result_amount = 700;
break;
}