我不明白为什么switch-case statement
需要在每个case
之后显式插入break
一旦生成case
,它的全部意义不就是停止吗
有人能给我一个case
被发现为true
的情况吗?但由于某种原因[你在这里插入原因],你仍然需要代码块来执行。
这是一个有效PHP switch-case statement
switch ($error) {
case 'empty':
$msg = 'Field cannot be empty.';
break;
case 'invalid':
$msg = "Field may only contain number.";
break;
}
这是入侵PHP switch-case statement
switch ($error) {
case 'empty':
$msg = 'Field cannot be empty.';
case 'invalid':
$msg = "Field may only contain number.";
}
那么,这个break
是无用的,还是在某些情况下有作用?
因为这就是它的工作方式——这就是语言的设计方式。可能是因为C就是这么做的。
最常见的用途是对两个case
进行相同的处理。
switch ($error) {
// Treat warnings and errors the same
case 'warning':
case 'error':
echo "Something went wrong.";
break;
}
我相信这个问题与这个问题重复,@Micahel Burr:有力地回答了这个问题
许多答案似乎都集中在失败的能力上,这是要求中断陈述的原因。
我相信这只是一个错误,主要是因为当C设计时,对这些将使用构造。
彼得·范德林登在他的著作《专家C》中提出了这一观点编程":
我们分析了Sun C编译器的源代码,以了解默认使用了跌倒。Sun ANSI C编译器前端有244switch语句,每个语句平均有七种情况。落下在所有这些病例中,只有3%的病例发生了穿透。
换句话说,正常的开关行为在97%的情况下是错误的。这不仅仅是在编译器中——相反,失败在哪里在这种分析中,它通常用于发生次数更多的情况在编译器中比在其他软件中更频繁,例如,当编译可以有一个或两个操作数的运算符:
switch (operator->num_of_operands) {
case 2: process_operand( operator->operand_2);
/* FALLTHRU */
case 1: process_operand( operator->operand_1);
break; }
案例失败被广泛认为是一个缺陷甚至还有一个特殊的评论惯例,如上所示告诉《lint》,这确实是3%的病例之一是理想的。"
我认为C#需要显式跳转是个好主意每个case块末尾的语句(同时仍然允许多个箱子标签要堆叠-只要只有一块语句)。在C#中,你仍然可以从一个案例转到另一个案例-你只需要通过使用goto跳到下一个案例来明确失败。
Java没有抓住机会从C语义。
它也用于组合条件。
举一个有点无用的例子:
// 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
通常只是出于文体原因而被使用)。
一个语句可以携带多个事例标签,如下例所示,我们不使用break
:
switch($constant)
{
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' : hexcvt(c);
}
在本例中,如果常量表达式等于"a"answers"f"之间的任何字母,则调用hexcvt函数。