[英]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 -P
的gcc
运行它以仅运行预处理器, 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.