我不明白为什么switch-case statement
要求您在每个break
后明确插入case
。 一旦case
成立,它的全部意义不是停止吗?
有人可以给我一个找到case
true
的情况但由于某种原因[你在这里插入原因],你仍然需要代码块来执行。
这是 vaild PHP switch-case statement
switch ($error) {
case 'empty':
$msg = 'Field cannot be empty.';
break;
case 'invalid':
$msg = "Field may only contain number.";
break;
}
这是 invaild PHP switch-case statement
switch ($error) {
case 'empty':
$msg = 'Field cannot be empty.';
case 'invalid':
$msg = "Field may only contain number.";
}
那么这个break
是无用的还是在某些情况下它有用呢?
答案 0 :(得分:5)
因为这就是它的工作方式 - 这就是语言的设计方式。可能是因为C就是这样做的。
最常见的用途是对两个case
进行相同的处理。
switch ($error) {
// Treat warnings and errors the same
case 'warning':
case 'error':
echo "Something went wrong.";
break;
}
答案 1 :(得分:0)
我认为这个问题与此问题重复,@Micahel Burr强烈回答:
许多答案似乎都集中在作为要求破坏声明的理由的能力上。
我认为这只是一个错误,主要是因为当C是 设计的那些经验并没有那么多 将使用构造。
彼得范德林登在他的书“专家C”中提到了这个案子 编程“:
我们分析了Sun C编译器源,看看默认的频率 通过使用了。 Sun ANSI C编译器前端有244个 switch语句,每个语句平均有七个案例。秋季 在所有这些案件中仅占3%。
换句话说,正常的开关行为在97%的时间是错误的。 它不仅仅是在编译器中 - 恰恰相反,它是在堕落的地方 在此分析中使用的情况通常是出现更多情况 经常在编译器中而不是在其他软件中,例如,何时 编译可以有一个或两个操作数的运算符:
switch (operator->num_of_operands) {
case 2: process_operand( operator->operand_2);
/* FALLTHRU */
case 1: process_operand( operator->operand_1);
break; }
案件失败被广泛认为是一种缺陷 甚至是上面显示的特殊评论惯例 告诉皮特“这实际上是3%的情况之一 很理想。“
我认为C#需要一个明确的跳转是一个好主意 每个案例块末尾的陈述(同时仍然允许多个 要堆叠的案例标签 - 只要只有一个块 语句)。在C#中你仍然可以让一个案例落到另一个案例中 - 你只需要通过使用goto跳转到下一个案例来明确表达。
糟糕的是,Java并没有抓住机会从C中脱颖而出 语义。
答案 2 :(得分:0)
它也用于组合条件。
给出一个无用的例子:
// manually total up a number by 1
$sum = 0;
switch ($number) {
case 4:
$sum += 1;
case 3:
$sum += 1;
case 2:
$sum += 1;
case 1:
$sum += 1;
}
这将switch
设置为独占if
树,因为一个案例可以是另一个案例的超集,并减少代码重复。如果您的所有案例都包含break
,那么您当然可以将其转换为if
列表。 (switch
通常只是出于文体原因而使用。)
答案 3 :(得分:0)
单个语句可以包含多个案例标签,因为以下示例显示了我们未使用break
的位置:
switch($constant)
{
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' : hexcvt(c);
}
在这个例子中,如果constant-expression等于'a'和'f'之间的任何字母,则调用hexcvt函数。