我是第二个OOP课程的编程学生,我有一个简单的问题,我无法在互联网上找到答案,如果它在那里,我道歉。
我的问题是:
是否有可能在switch语句中有布尔条件?
例:
switch(userInputtedInt)
{
case >= someNum && <= someOtherNum
break;
// Is this possible?
}
不,这在C ++中是不可能的。 Switch语句仅支持匹配的整数和字符(它们将被ASCII值替换)。如果您需要复杂的布尔条件,那么您应该使用if / else块
一些C ++编译器仍然支持今天的语法 - 在最初提出这个问题8年后。这让我感到惊讶。
我在2012年学过Pascal,Pascal确实有范围符号。然后有些东西鼓励我尝试使用类似C ++的语法,然后它出乎意料地工作。
我的笔记本电脑上的编译器是g ++(GCC)6.4.0(来自Cygwin项目)std = c ++ 17
有一个工作的例子,我写的很快。 repl.it
此外,源代码附件如下:
#include <iostream>
using namespace std;
#define ok(x) cout << "It works in range(" << x << ")" << endl
#define awry cout << "It does\'t work." << endl
int main() {
/*bool a, b, c, d, e, f, g;
switch(true) {
case (a): break; These does not work any more...
case (b and c): break;
}*/
char ch1 = 'b';
switch(ch1) {
case 'a' ... 'f': ok("a..f"); break;
case 'g' ... 'z': ok("g..z"); break;
default: awry;
}
int int1 = 10;
switch(int1) {
case 1 ... 10: ok("1..10"); break;
case 11 ... 20: ok("11..20"); break;
default: awry;
}
return 0;
}
正如其他人所说,你无法直接实现这一点,因为C ++语法不允许这样做。但你可以这样做:
switch( userInputtedInt )
{
// case 0-3 inclusve
case 0 :
case 1 :
case 2 :
case 3 :
// do something for cases 0, 1, 2 & 3
break;
case 4 :
case 5 :
// do something for cases 4 & 5
break;
}
不,这通常是if
声明的范围:
if ((userInputtedInt >= someNum) && (userInputtedInt <= someOtherNum)) { ... }
当然,您可以将其纳入switch
声明中:
switch (x) {
case 1:
// handle 1
break;
default:
if ((x >= 2) && (x <= 20)) { ... }
}
它不可能直接 - C或C ++ switch语句要求每个case都是常量,而不是布尔表达式。如果您具有均匀分布的范围,则通常可以使用整数除法获得相同的效果。例如如果你有1到100的输入,并希望将90-100作为一个组,80-89作为另一个组,依此类推,你可以将输入除以10,每个结果将代表一个范围。
或者你也许可以这样做
switch((userInputtedInt >= someNum) && (userInputtedInt <= someOtherNum))
{
case true:
//do something
break;
case false:
//something else
break;
}
但这只是可以用if-else语句处理的非常糟糕的编程。
这是不可能的。如果值合理地靠近在一起,你可以最接近一些
switch(userInputtedInt)
{
case someNum:
case someNum+1:
// ...
case someOtherNum:
break;
}
C ++不支持这一点。
但是,如果您不关心编写可移植的标准代码,则某些编译器支持这种扩展语法:
switch(userInputtedInt)
{
case someNum...someOtherNum:
break;
}
这些值必须是不变的。
如果您喜欢预处理器,您可以编写某种宏,自动扩展为所需的case语句数。然而,这需要一个包含几乎所有case语句的长文件(例如:#define CASE0 case 0:#define CASE1 case 1:...)
你不应该去那里,但这很有趣...为了好玩! ;)
该标准不允许这样做:
6.4.2 switch语句[stmt.switch]
[...] switch语句中的任何语句都可以用一个或多个case标签标记,如下所示:
case constant-expression :
其中constant-expression应为整数常量表达式(5.19)。