【问题标题】:Is it possible to use goto with switch?是否可以将 goto 与 switch 一起使用?
【发布时间】:2011-11-20 14:33:16
【问题描述】:

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

【问题讨论】:

  • 你试过了吗?我觉得有可能……
  • 为什么不使用标准编程实践并让elsedefault 调用一个函数(内联或其他),因为它们旨在执行相同的操作。
  • @MerlynMorgan-Graham 你不能使用 goto 默认值; default 是关键字,不能用作标签。 C# 这样做的事实很糟糕 :-) 呵呵 ...
  • 实际上,将默认值设置为另一个标签,如果不匹配则默认为默认值。这就是大会所做的。如果该值不在跳转表中,它将跳转到默认位置。所以我不会说允许一个人跳到 default: 是有问题的。棘手的部分是某些语言将 switch 视为带有布尔值的 if/else-if。
  • 搁浅 1) 我在谈论 C 的解析阶段; C 关键字不允许用作标签; 2)您假设生成的程序集将使用标签/跳转...如果目标 CPU 使用一些完全不同的分支机制怎么办?

标签: c++ switch-statement goto


【解决方案1】:

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

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

人们往往会忘记开关的强大功能

【讨论】:

  • @Matt “很多人(甚至是 bwk?)都说 C 语言最糟糕的特性是开关不会在每个 case 标签之前自动中断。这段代码在这场辩论中形成了某种争论,但我不确定是赞成还是反对。”
  • 这不是缺少中断,而是在 if 块的组件之间放置 case 标签。
  • 我想知道,如果colorBLUEAlsoHasCriteriaXfalse,那会同时调用Paint()Print() 吗?或者:如果您直接跳入if 正文,如何评估else 语句?
  • 这段代码的真正问题是当您尝试更改/添加某些内容时。
  • 忘掉所有的批评。这个 sn-p 太棒了,真正的程序员必须能够应付这种事情。竖起大拇指(并投票)!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 2021-08-28
    • 2021-11-12
    • 2016-04-01
    • 2011-01-20
    • 2018-08-11
    • 2021-08-05
    • 2019-03-18
    • 2014-03-15
    相关资源
    最近更新 更多