C 为什么这些案件事先没有陈述?
进入以下代码C 为什么这些案件事先没有陈述?,c,switch-statement,C,Switch Statement,进入以下代码案例1:到案例2:和案例5:似乎没有可执行的代码。我的问题是我们不能省略键入它们吗 switch(c) { case 1: case 2: case 3: a++; break; case 5: default: b++; break; } 它们失败了,即,如果遇到1或2,它将跳转到这些情况中,因为没有中断只需继续执行案例3。因此,您不能忽略它们,否则1和2将跳转到default 类似地,案例5将变成default,这意味着您可以忽
案例1:
到案例2:
和案例5:
似乎没有可执行的代码。我的问题是我们不能省略键入它们吗
switch(c)
{
case 1:
case 2:
case 3:
a++;
break;
case 5:
default:
b++;
break;
}
它们失败了,即,如果遇到
1
或2
,它将跳转到这些情况中,因为没有中断
只需继续执行案例3
。因此,您不能忽略它们,否则1
和2
将跳转到default
类似地,案例5
将变成default
,这意味着您可以忽略案例5
本质上,switch
语句可以想象为goto
跳到适当的位置。这意味着,程序将跳转到适当的情况下,并从那里继续工作,直到找到break
或return
。这意味着,如果您不希望程序在后续的案例中继续执行,则必须显式地编写中断
或返回
我的问题是我们不能省略键入它们吗
TL;DR--在您的情况下,不。它们有一定的意义
引用C11
,第§6.8.4.2章,开关语句
对控制表达式执行整数提升。每个大小写标签中的常量表达式将转换为控制表达式的提升类型。如果转换的值与提升的控制表达式的值匹配,则控制将跳转到匹配的大小写标签后面的语句
这意味着,基于这里的c
值,将执行特定的“case”
好的。等等,现在我们知道从哪里开始执行控制,但是到底从哪里停止?
你在想“在下一个案例
正文之前?”
嗯,不完全是这样。它不会自动停止。通常,我们使用break每个案例
块后的code>语句,以“标记”该特定案例的结尾。在这种情况下,中断代码>不存在,它将继续执行以下案例
s(如果有)中的语句,就像它们是同一案例
块的一部分一样,并将继续执行,直到到达开关
主体的末端
现在,详细说明一下,在您的案例中,如果c
的值是1
、2
或3
,它将执行案例3
的语句块。注意,没有中断代码>在案例1:
和案例2:
标签后的语句。这是一种“失败”的技术
OTOH,如果移除案例1:
和案例2:
标签,如果c
保持1
或2
,控件将不会到达案例3:
后的块,它将转到默认:
标签
但是,case 5:
将变成default:
标签,使其成为冗余。这一次可以删除。不,不能忽略它们。基本上,案例1
和2
都会变成3
。省略它们会导致对输入值1
和2
执行默认情况,这是一个故障情况。这意味着箱子会倒塌,直到出现断裂。因此,a++
将被排除在c
为1,2,3的情况下。1,2和3的情况意味着如果c=1,2或3,则a++。如果c=5或不同,则b++-请注意,代码仅在遇到中断时停止,例如,c=1给出的结果与c=3相同。它们可能会被忽略,但结果会不同。
基本上,代码所做的是执行c
等于1、2或3的a++
,否则,b++
执行
在这种情况下,案例5:
毕竟应该省略,因为它属于默认:
案例。您确实可以省略一个案例。这个switch语句
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;
}
不使用标签情况5:
。但您不能排除标签案例1:
和案例2:
使用这些标签,可以使用if-else语句按以下方式重写switch语句
if ( 1 <= c && c <= 3 )
{
a++;
}
else
{
b++;
}
正如你自己所见,这两个if-else语句之间有很大的区别。为什么不试试,看看会发生什么?相关:
if ( c == 3 )
{
a++;
}
else
{
b++;
}