繁体   English   中英

将 switch 语句案例组合在一起?

[英]Grouping switch statement cases together?

我可能看漏了一些东西,但是 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;
}

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

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

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

你当然可以。

您可以使用 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”标志

不,但是您可以使用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]这是实现您想要的目标的灵活方式。

你可以这样使用:

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

用于使用 4 或 2 个开关盒。

您不能删除关键字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构造一样简洁。

如果您愿意走预处理器滥用的道路, 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))

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

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

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

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

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

对你也是如此。

gcc 有一个所谓的“大小写范围”扩展:

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

当我只使用 gcc 时,我曾经使用过它。 真的没什么好说的——它确实可以满足您的需求,尽管只是针对值的范围。

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

(我怀疑对于你的例子来说, if语句会更自然。)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM