为什么这些案件没有提前声明?

时间:2015-07-10 14:53:00

标签: c switch-statement

进入以下代码case 1:case 2:case 5:似乎没有执行代码。我的问题是我们不能省略输入它们吗?

switch(c)
{
  case 1:
  case 2:
  case 3:
    a++;
    break;
  case 5:
  default:
     b++;
  break;
}

7 个答案:

答案 0 :(得分:5)

他们失败了,即如果遇到12,它会跳到这些案例中,因为没有break只是继续案例3 。所以你不能省略这些,因为否则12会跳转到default

类似地,案例5将落到default,这意味着您可以省略case 5

基本上,switch语句可以设想为goto - 跳转到适当的位置。这意味着,该程序将跳转到相应的案例并继续在那里工作,直到找到breakreturn。这意味着,如果您不希望程序在后续break中继续执行,则必须明确地写returncase

答案 1 :(得分:0)

  

我的问题是,我们不能省略输入吗?

TL; DR - 在您的情况下, 。他们有一些意义。

引用C11,章节§6.8.4.2, switch陈述

  

对控制表达式执行整数提升。每个case标签中的常量表达式将转换为控制表达式的提升类型。如果转换后的值与提升的控制表达式匹配,则控制将跳转到匹配的case标签后面的语句....

这意味着,根据此处c,将执行特定的“案例”。

精细。等等,现在我们知道在哪里控制开始执行,但确切地停在哪里?

你在下一个case身体之前想到“?

嗯,不完全是。它不会自动停止。通常,我们在每个break;块之后使用case语句来“标记”该特定情况的结束。如果break;不存在,它将继续执行以下case s(如果有)的语句,就像它们是同一case块的一部分一样,它将会继续直到它到达switch身体的末尾。

现在,要详细说明,如果c的值为123,它将执行{{case 3的语句块1}}。请注意,break;case 1:标签后没有case 2:声明。这是一种“堕落”技术。

OTOH,如果您移除case 1:case 2:标签,如果c成员12,则控件不会到达 case 3:后的阻止,它将转到default:标签。

但是,case 5:会落到default:标签,使其变得多余。这一次可以删除。

答案 2 :(得分:0)

不,你不能省略它们。基本上案例12将落实到3。省略它们会导致对输入值12执行默认情况。

答案 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语句之间存在很大差异。