怀疑在C中使用switch语句

我有一个疑问:为什么我在i=3 i=7时得到输出?

 main() { int i; scanf("%d",&i); switch(i) { case 3: printf("message3"); default: if(i==4) printf("message4"); case 2:printf("message2"); break; case 1:printf("Message1"); } } 

好,

i == 3将打印message3和message2
i == 4将打印message4 abd message2
i的每个其他值都将打印message2

使用break来终止匹配的处理。

@Shubham。 如果我重复你已经知道的事,请原谅我。 在某些方面,我正在扩展@Henk已经指出的内容。

switch语句中, casedefault标签的作用仅用于确定执行应该从哪里开始。 确定第一个标签后,其余标签没有任何意义。 执行是“落伍”。 因此,我们必须使用break来停止和退出switch

在你的代码中,如果i == 3那么case 3是第一行执行。 然后执行case 3defaultcase 2 ,然后执行break

如果i3以外的任何值,则执行default ,然后执行case 2 ,然后退出switch 。 由于default位置,我认为不会执行case 1

在案例3和default情况下,您没有break

case 3之后没有break 。 因此, switch也会通过并执行default语句。

default情况的顺序不确定何时执行该情况。 当switch变量与case表达式中的任何值都不匹配时,将执行default情况。

对于上面的代码值

  • 当执行case 1的代码时, 1将打印“消息1”
  • 当执行case 2的代码时,图2将打印“消息2”
  • 当执行case 3之后的代码时, 3将打印“消息3message2”,并且default case 2为“ default并且通过case 2
  • 当执行default的代码并通过case 2时, 4将打印“message 4message2”
  • 执行default情况时,任何其他值都将打印“消息2”,并通过case 2

我有时会使用默认开关编码我的开关

 switch (ch) { default: break; /* do nothing */ case '.': ch = ','; break; /* swap commas */ case ',': ch = '.'; break; /* and periods */ }