【问题标题】:Grouping switch statement cases together?将switch语句案例分组在一起?
【发布时间】:2010-12-20 21:32:24
【问题描述】:

我可能看多了一些东西,但是在 C++ 中有没有一种简单的方法可以将案例组合在一起而不是单独写出来?我记得基本上我可以做到:

SELECT CASE Answer
CASE 1, 2, 3, 4

C++ 中的示例(适合需要的人):

#include <iostream.h>
#include <stdio.h>
int main()
{
   int Answer;
   cout << "How many cars do you have?";
   cin >> Answer;
   switch (Answer)                                      
      {
      case 1:
      case 2:
      case 3:
      case 4:
         cout << "You need more cars. ";
         break;                                        
      case 5:
      case 6:
      case 7:
      case 8:
         cout << "Now you need a house. ";
         break;                                        
      default:
         cout << "What are you? A peace-loving hippie freak? ";
      }
      cout << "\nPress ENTER to continue... " << endl;
      getchar();
      return 0;
}

【问题讨论】:

  • 嗯,我想你已经回答了自己的问题......
  • 对于您提供的特定示例,更简单的方法是if (Answer &gt;=1 &amp;&amp; Answer &lt;=4)
  • @Falmari 不,他想要更紧凑的形式,例如case 1, 2, 3, 4:
  • 我意识到我做对了。我只是在利用我的资源来寻找做事的最佳方式。尽管 C++ 是多余的,但我希望有一种更好的方法来对输出进行分组,然后键入 case 400 次来对输出进行分组。
  • 如果您执行 case 1: case 2: 等,GCC 现在将报告 Wimplicit-fallthrough,因此最好有一种优雅的跨平台方式来处理此问题,而无需禁用编译器警告。

标签: c++ switch-statement


【解决方案1】:

AFAIK 你所能做的就是省略返回以使 C++ 中的内容更紧凑:

switch(Answer)
{
    case 1: case 2: case 3: case 4:
        cout << "You need more cars.";
        break;
    ...
}

(当然,您也可以删除其他返回值。)

【讨论】:

  • case 和数字之间需要空格,不是吗?
  • @marcog,是的!修复它,请注意。
【解决方案2】:

当然可以。

你可以使用 case x ... y 作为范围

例子:

#include <iostream.h>
#include <stdio.h>
int main()
{
   int Answer;
   cout << "How many cars do you have?";
   cin >> Answer;
   switch (Answer)                                      
      {
      case 1 ... 4:
         cout << "You need more cars. ";
         break;                                        
      case 5 ... 8:
         cout << "Now you need a house. ";
         break;                                        
      default:
         cout << "What are you? A peace-loving hippie freak? ";
      }
      cout << "\nPress ENTER to continue... " << endl;
      getchar();
      return 0;
}

确保您在编译器中启用了“-std=c++0x”标志

【讨论】:

  • 请注意,这是一个 GNU 扩展,而不是标准的 c++ 11。
【解决方案3】:

不,但您可以使用if-else if-else 链来实现相同的结果:

if (answer >= 1 && answer <= 4)
  cout << "You need more cars.";
else if (answer <= 8)
  cout << "Now you need a house.";
else
  cout << "What are you? A peace-loving hippie freak?";

您可能还想处理汽车数量为 0 的情况,然后可能通过抛出异常来处理汽车数量为负数的意外情况。

PS:我已将 Answer 重命名为 answer,因为以大写字母开头的变量被认为是不好的风格。

附带说明一下,Python 等脚本语言允许使用漂亮的 if answer in [1, 2, 3, 4] 语法,这是实现所需目标的灵活方式。

【讨论】:

  • 关系运算符不能在 switch 语句中使用很糟糕... :-\
  • @Josh 是什么让你如此执着于 switch 语句?如果它们不能满足您的需求,请使用更合适的替代方案。
  • 没什么。我刚刚阅读了一篇关于分支语句的文章,并注意到他们在它们上花费了很多时间,出于某种原因,我认为还有另一种方法可以对它们进行分组。老实说,我刚开始编程时只使用过 Switch 语句。
【解决方案4】:

您不能删除关键字case。但是您的示例可以像这样写得更短:

switch ((Answer - 1) / 4)                                      
{
   case 0:
      cout << "You need more cars.";
      break;                                        
   case 1:
      cout << "Now you need a house.";
      break;                                        
   default:
      cout << "What are you? A peace-loving hippie freak?";
}

【讨论】:

  • 我其实很喜欢这个主意。谢谢!
  • 这确实是仍然使用 switch 语句并且不必定义每种情况的唯一方法。
  • 这段代码试图变得聪明。一般来说,这不是一件好事。但这是答案:-)。请注意,较短并不总是更好。
  • 如果我们走这条路,#define CASE1234 case 1: case 2: case 3: case 4:
【解决方案5】:

您的示例与 switch 构造一样简洁。

【讨论】:

    【解决方案6】:

    你可以这样使用:

    case 4: case 2:
     {
       //code ...
     }
    

    适用于 4 或 2 个开关盒。

    【讨论】:

      【解决方案7】:

      如果您愿意走预处理器滥用的道路,Boost.Preprocessor 可以帮助您。

          #include <boost/preprocessor/seq/for_each.hpp>
      
          #define CASE_case(ign, ign2, n) case n:
      
          #define CASES(seq) \
              BOOST_PP_SEQ_FOR_EACH(CASE_case, ~, seq)
      
          CASES((1)(3)(15)(13))
      

      通过gcc-E -P 运行它以仅运行预处理器,CASES 的扩展给出:

          case 1: case 3: case 15: case 13:
      

      请注意,这可能不会通过代码审查(不会在我工作的地方!)所以我建议将其限制为个人使用。

      还应该可以创建一个CASE_RANGE(1,5) 宏来扩展

          case 1: case 2: case 3: case 4: case 5:
      

      也适合你。

      【讨论】:

        【解决方案8】:

        gcc 有一个所谓的“case range”扩展:

        http://gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Case-Ranges.html#Case-Ranges

        我以前只用 gcc 的时候用过这个。真的没什么好说的——它可以满足你的需求,尽管只适用于值的范围。

        这个最大的问题是只有gcc支持;这对你来说可能是也可能不是问题。

        (我怀疑对于您的示例,if 语句会更合适。)

        【讨论】:

          【解决方案9】:

          不,除非你想破坏兼容性并且你的编译器支持它。

          【讨论】:

            【解决方案10】:
            #include <stdio.h>
            int n = 2;
            int main()
            {
                 switch(n)
                 {
                      case 0: goto _4;break;
                      case 1: goto _4;break;
                      case 2: goto _4;break;
                      case 3: goto _4;break;
                      case 4:
                          _4:
                            printf("Funny and easy!\n");
                            break;
                      default:
                            printf("Search on StackOverflow!\n");
                            break;
                 }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-10-23
              • 1970-01-01
              • 2023-03-29
              • 2014-01-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-03-22
              相关资源
              最近更新 更多