使用goto语句能否与switch语句一起使用?

36

看起来使用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;
}

1
你试过了吗?我认为这可能是可行的... - Merlyn Morgan-Graham
为什么不使用标准的编程实践,让 elsedefault 调用一个函数(内联或其他方式),因为它们旨在执行相同的操作。 - Jim H.
2
@MerlynMorgan-Graham 你不能使用 goto default; default 是一个关键字,不能用作标签。C# 这样做的事实有点混乱 :-) 嘿嘿... - Ahmed Masud
实际上,将默认设置为另一个标签并将其设置为默认值(如果没有匹配项)是完全有意义的。这就是汇编所做的。如果值不在跳转表中,则会跳转到默认位置。因此,我不会说允许跳转到默认值是错误的。问题出在一些语言将switch视为带有布尔值的if/else-if。 - Beached
1)我在谈论C语言的解析阶段;C关键字不允许用作标签; 2)你假设生成的汇编代码将使用标签/跳转...如果目标CPU使用完全不同的分支机制怎么办? - Ahmed Masud
2个回答

48

Ahmed的回答很好,但还有:

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

人们往往忘记开关的威力有多大。


20
很多人(包括bwk在内)都说C语言最糟糕的特点是switch语句在每个case标签之前不会自动中断。这段代码在这一争论中提出了某种观点,但我不确定它是支持还是反对这种说法。 - Steve Cox
6
重点不在于缺少break,而在于在if块的组件之间放置case标签。 - Matt
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Torben L.
3
这段代码的真正问题在于当你尝试更改/添加一些内容时。 - Piotr Siupa
6
忘记所有的批评。这段代码很棒,真正的程序员必须能够应对这种情况。点赞(和投票)! - linuxfan says Reinstate Monica
显示剩余4条评论

38

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

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

或者你可以这样做:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接