将switch语句组合在一起?

时间:2010-12-20 21:32:25

标签: c++ switch-statement

我可能在寻找一些东西,但在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;
}

10 个答案:

答案 0 :(得分:28)

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

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

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

答案 1 :(得分:15)

当然可以。

您可以使用案例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;
}

确保你有&#34; -std = c ++ 0x&#34;在编译器中启用了标志

答案 2 :(得分:12)

不,但您可以使用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]语法,这是实现所需内容的灵活方式。

答案 3 :(得分:5)

您无法删除关键字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?";
}

答案 4 :(得分:3)

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

答案 5 :(得分:1)

gcc有一个所谓的“案例范围”扩展名:

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

当我只使用gcc时,我曾经使用过它。真的没什么好说的 - 它确实是你想要的,但只是价值范围。

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

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

答案 6 :(得分:1)

您可以这样使用:

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

使用4或2个开关盒。

答案 7 :(得分:1)

如果您愿意采用预处理程序滥用方式,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 :(得分:0)

不,除非您想要破坏兼容性,否则您的编译器会支持它。

答案 9 :(得分:0)

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