以下代码case 1:
至case 2:
和case 5:
似乎没有执行代码。我的问题是我们不能忽略键入它们吗?为什么这些案件没有提前陈述?
switch(c)
{
case 1:
case 2:
case 3:
a++;
break;
case 5:
default:
b++;
break;
}
以下代码case 1:
至case 2:
和case 5:
似乎没有执行代码。我的问题是我们不能忽略键入它们吗?为什么这些案件没有提前陈述?
switch(c)
{
case 1:
case 2:
case 3:
a++;
break;
case 5:
default:
b++;
break;
}
他们告吹,即如果遇到1
或2
将跳转到这些案件,因为没有break
只是继续的情况下3
。所以你不能忽略这些,否则1
和2
会跳转到default
。
类似地,案例5
将落入default
,这意味着您可以省略case 5
。
基本上,switch
语句可以想象为goto
- 跳转到适当的位置。这意味着,该程序将跳转到相应的案例,并继续从那里开始工作,直到找到break
或return
。这意味着,如果您不希望程序在后续的case
中继续执行,则必须明确地写入break
或return
。
我的问题是我们不能只是省略键入它们吗?
TL; DR -在你的情况,没有。他们有一些意思。
引用C11
,章§6.8.4.2,switch
的语句
整数提升上控制表达式执行。在每种情况下标签中的常量表达式都被转换为控制表达式的提升类型。如果转换后的值相匹配的是,促进控制表达的,控制跳转到以下匹配
case
标签的声明....
这意味着,基于该价值c
这里,特定的“案例”将被执行。
好。等等,现在我们知道去哪里采取控制开始执行,但究竟停在哪里?
你在想“在下一个case
身体?”
嗯,不完全是。它不会自动停止。通常,我们在每个case
块之后使用break;
语句来“标记”该特定情况的结束。如果break;
不存在,它将继续执行以下case
(如果有)中的语句,就好像它们是同一个case
块的一部分,并且它将继续,直到它到达switch
主体的末尾。
现在,来阐述,在你的情况下,如果c
的值是1
,2
或3
,它将执行语句块case 3
。注意,case 1:
和case 2:
标签后面没有break;
声明。这是一种“落后”技术。
OTOH,如果去掉case 1:
和case 2:
标签,如果c
持有1
或2
,控制不会case 3:
后到达块,它会去default:
标签。
但是,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++
呢。
在这种情况下case 5:
应该被省略,因为它将落入default:
的情况。
确实可以省略一个案例。此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;
}
不使用标签case 5:
。但是你可能不排除标签case 1:
和case 2:
与这些标签的switch语句可以使用if-else语句下面的方式
if (1 <= c && c <= 3)
{
a++;
}
else
{
b++;
}
在另一方面没有这些情况下被改写标签对应的如 - else语句看起来像
if (c == 3)
{
a++;
}
else
{
b++;
}
正如你可以看到自己这两个if-else语句之间有很大的区别。
为什么不试试看看会发生什么? – juanchopanza
相关:http://stackoverflow.com/q/188461/10077 –