是否可以使用goto与开关?

Cod*_*der 32 c++ goto switch-statement

看来它可以用C#,但我需要用C++,最好是跨平台.

基本上,我有一个开关,可以根据单个条件对内容进行排序,并在其他所有内容上回退到默认处理.

说:

switch(color)
{
case GREEN:
case RED:
case BLUE:
    Paint();
    break;
case YELLOW:
    if(AlsoHasCriteriaX)
        Paint();
    else
        goto default;
    break;
default:
    Print("Ugly color, no paint.")
    break;
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*Cox 34

艾哈迈德的答案很好,但也有:

switch(color)
case YELLOW:
    if(AlsoHasCriteriaX)
case GREEN:
case RED:
case BLUE:
        Paint();
    else
default:
        Print("Ugly color, no paint.");
Run Code Online (Sandbox Code Playgroud)

人们往往会忘记交换机有多强大

  • @Matt"很多人(甚至是bwk?)都说C的最大特点是开关在每个案例标签之前不会自动中断.这个代码在辩论中形成了某种论点,但我不确定它是否是支持或反对." (10认同)
  • 这不是关于缺乏破坏,而是将案例标签放在if-block的组件之间. (5认同)
  • 嘿.这太棒了!我喜欢这种诡计(想到duff的设备),但这对我来说并不自然.:) (4认同)
  • 此代码的真正问题是当您尝试更改/添加某些内容时。 (3认同)
  • 我想知道,如果`color` 是`BLUE` 并且`AlsoHasCriteriaX` 是`false`,那会同时调用`Paint()` 和`Print()` 吗?或者:如果你直接跳到 `if` 主体,如何评估 `else` 语句? (2认同)
  • 忘记所有的批评。这个片段很棒,真正的程序员必须能够处理这种事情。竖起大拇指(和投票)! (2认同)
  • 创造力点,但我希望不要在学术练习之外遇到这种情况:} (2认同)

Ahm*_*sud 26

不完全,但你可以这样做:

switch(color)
{
case GREEN:
case RED:
case BLUE:
     Paint();
     break;
case YELLOW:
     if(AlsoHasCriteriaX) {
         Paint();
         break; /* notice break here */
     }
default:
     Print("Ugly color, no paint.")
     break;
}
Run Code Online (Sandbox Code Playgroud)

或者你可以这样做:

switch(color)
{
case GREEN:
case RED:
case BLUE:
     Paint();
     break;
case YELLOW:
     if(AlsoHasCriteriaX) {
         Paint();
         break; /* notice break here */
     }
     goto explicit_label;

case FUCHSIA:
     PokeEyesOut();
     break;

default:
explicit_label:
     Print("Ugly color, no paint.")
     break;
}
Run Code Online (Sandbox Code Playgroud)