进入以下代码case 1:
到case 2:
和case 5:
似乎没有执行代码。我的问题是我们不能省略输入它们吗?
switch(c)
{
case 1:
case 2:
case 3:
a++;
break;
case 5:
default:
b++;
break;
}
答案 0 :(得分:5)
他们失败了,即如果遇到1
或2
,它会跳到这些案例中,因为没有break
只是继续案例3
。所以你不能省略这些,因为否则1
和2
会跳转到default
。
类似地,案例5
将落到default
,这意味着您可以省略case 5
。
基本上,switch
语句可以设想为goto
- 跳转到适当的位置。这意味着,该程序将跳转到相应的案例并继续在那里工作,直到找到break
或return
。这意味着,如果您不希望程序在后续break
中继续执行,则必须明确地写return
或case
。
答案 1 :(得分:0)
我的问题是,我们不能省略输入吗?
TL; DR - 在您的情况下, 否 。他们有一些意义。
引用C11
,章节§6.8.4.2, switch
陈述
对控制表达式执行整数提升。每个case标签中的常量表达式将转换为控制表达式的提升类型。如果转换后的值与提升的控制表达式匹配,则控制将跳转到匹配的
case
标签后面的语句....
这意味着,根据此处c
的值,将执行特定的“案例”。
精细。等等,现在我们知道在哪里控制开始执行,但确切地停在哪里?
你在下一个case
身体之前想到“?
嗯,不完全是。它不会自动停止。通常,我们在每个break;
块之后使用case
语句来“标记”该特定情况的结束。如果break;
不存在,它将继续执行以下case
s(如果有)的语句,就像它们是同一case
块的一部分一样,它将会继续直到它到达switch
身体的末尾。
现在,要详细说明,如果c
的值为1
,2
或3
,它将执行{{case 3
的语句块1}}。请注意,break;
和case 1:
标签后没有case 2:
声明。这是一种“堕落”技术。
OTOH,如果您移除case 1:
和case 2:
标签,如果c
成员1
或2
,则控件不会到达 case 3:
后的阻止,它将转到default:
标签。
但是,case 5:
会落到default:
标签,使其变得多余。这一次可以删除。
答案 2 :(得分:0)
不,你不能省略它们。基本上案例1
和2
将落实到3
。省略它们会导致对输入值1
和2
执行默认情况。
答案 3 :(得分:0)
这是一个落实案例。这意味着案件会在出现中断之前倒下。因此a++
会因c
为1,2,3而受到影响。
答案 4 :(得分:0)
1,2和3的情况意味着如果c = 1,2或3,那么a ++。如果c = 5或不同,那么b ++ - 请注意,只有在中断时代码才会停止,因此c = 1与c = 3相同,例如。
答案 5 :(得分:0)
它们可能会被省略,但结果会有所不同。
基本上,代码所做的是c
等于1,2或3 a++
执行,否则,b++
会执行。
在这种情况下,case 5:
应该省略,因为它属于default:
案例。
答案 6 :(得分:0)
你确实可以省略案例。这个开关语句
switch(c)
{
case 1:
case 2:
case 3:
a++;
break;
case 5:
default:
b++;
break;
}
可以像
一样重写switch(c)
{
case 1:
case 2:
case 3:
a++;
break;
default:
b++;
break;
}
不使用标签case 5:
。但您可能不会排除标签case 1:
和case 2:
使用这些标签可以使用if-else语句以下列方式重写switch语句
if ( 1 <= c && c <= 3 )
{
a++;
}
else
{
b++;
}
另一方面,如果没有这些case标签,相应的if-else语句将如下所示
if ( c == 3 )
{
a++;
}
else
{
b++;
}
正如您所看到的,这两个if-else语句之间存在很大差异。