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++;
}