case-switch是否像这样工作?

Man*_*ish 7 c c++

我今天遇到了一个代码转换代码,看到它是如何工作的,有点惊讶.代码是:

switch (blah)
{
case a:
  break;
case b:
  break;
case c:
case d:
case e: 
  {
    /* code here */
  }
  break;
default :
  return;
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,在变量所在的场景中c,路径进入了"此处代码"段.我同意c在案件开关部分的末端没有中断,但我会想象它会通过default.当你降落在一条case blah:线上时,它不会检查你当前的值是否与特定情况相匹配,然后只让你进入特定的区段?否则案件有什么意义?

Mer*_*ham 15

这称为案例落实,是一种理想的行为.它允许您在案例之间共享代码.

如何使用案例直通行为的示例:

switch(blah)
{
case a:
  function1();
case b:
  function2();
case c:
  function3();
  break;
default:
  break;
}
Run Code Online (Sandbox Code Playgroud)

如果进入交换机时blah == a,那么你将执行function1(),function2()和function3().

如果您不希望出现此行为,可以通过包含break语句来选择退出.

switch(blah)
{
case a:
  function1();
  break;
case b:
  function2();
  break;
case c:
  function3();
  break;
default:
  break;
}
Run Code Online (Sandbox Code Playgroud)

switch语句的工作方式是它(或多或少)执行a goto来跳转到case标签,并从那一点继续运行.当执行命中时break,它会离开开关块.

  • @Manish:Switch通常使用"[分支表](http://en.wikipedia.org/wiki/Branch_table)"来实现,这样也可以帮助您理解.编程中不存在常识,BTW.你需要"程序员意识":) (2认同)
  • @Manish这两种行为都是可取的,如果需要,可以有默认的直通和明确的"break",或者默认突破,并明确地"继续"到下一种情况.从常识的角度来看,后者可能看起来更自然,但考虑到实施,默认的跌倒更自然,因此选择了. (2认同)

she*_*les 10

这是正确的行为,它被称为"堕落".这使您可以使用相同的代码处理多个案例.在高级情况下,您可能希望在一种情况下执行某些代码,然后再转到另一种情况.

举例:

switch(command)
{
   case CMD_SAVEAS:
   {
      this->PromptForFilename();
   } // DO NOT BREAK, we still want to save
   case CMD_SAVE:
   {
      this->Save();
   } break;


   case CMD_CLOSE:
   {
      this->Close();
   } break;

   default:
      break;
}
Run Code Online (Sandbox Code Playgroud)