是否可以在Switch语句中执行以下操作 - C ++?

时间:2010-01-19 15:52:26

标签: c++ switch-statement

我是第二个OOP课程的编程学生,我有一个简单的问题,我无法在互联网上找到答案,如果它在那里,我道歉。

我的问题是:

是否可能在switch语句中有布尔条件?

示例:

switch(userInputtedInt)
{
    case >= someNum && <= someOtherNum
    break;
    // Is this possible?
}

10 个答案:

答案 0 :(得分:12)

这在C ++中是不可能的。 Switch语句仅支持匹配的整数和字符(它们将被ASCII值替换)。如果您需要复杂的布尔条件,那么您应该使用if / else块

答案 1 :(得分:7)

不,这通常是if声明的范围:

if ((userInputtedInt >= someNum) && (userInputtedInt <= someOtherNum)) { ... }

当然,您可以将其合并到switch声明中:

switch (x) {
    case 1:
        // handle 1
        break;
    default:
        if ((x >= 2) && (x <= 20)) { ... }
}

答案 2 :(得分:7)

正如其他人所说,你不能像你想要的那样直接实现 ,因为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;
}

答案 3 :(得分:3)

直接不可能 - C或C ++ switch语句要求每个case都是常量,而不是布尔表达式。如果您具有均匀分布的范围,则通常可以使用整数除法获得相同的效果。例如如果你有1到100的输入,并希望将90-100作为一个组,80-89作为另一个组,依此类推,你可以将输入除以10,每个结果将代表一个范围。

答案 4 :(得分:1)

或者你也许可以这样做

switch((userInputtedInt >= someNum) && (userInputtedInt <= someOtherNum))
{
case true:
     //do something
     break;
case false: 
     //something else
     break;
}

但这只是一种可以用if-else语句处理的非常糟糕的编程。

答案 5 :(得分:0)

这是不可能的。如果值合理地靠近在一起,则最接近的是

switch(userInputtedInt)
{
    case someNum:
    case someNum+1:
    // ... 
    case someOtherNum:
    break;

}

答案 6 :(得分:0)

C ++不支持。

但是,如果您不关心编写可移植的标准代码,某些编译器会支持这种扩展语法:

switch(userInputtedInt)
{
    case someNum...someOtherNum:
    break;
}

这些值必须保持不变。

答案 7 :(得分:0)

如果您喜欢预处理器,您可以编写某种宏,自动扩展为所需的case语句数。然而,这需要一个包含几乎所有case语句的长文件(例如:#define CASE0 case 0:#define CASE1 case 1:...)

你不应该去那里,但做起来很有趣......为了好玩! ;)

答案 8 :(得分:0)

该标准不允许这样做:

  

6.4.2 switch语句[stmt.switch]

     

[...] switch语句中的任何语句都可以用一个或多个case标签标记,如下所示:

     

case constant-expression :

     

其中,常量表达式应为整数常量表达式(5.19)。

答案 9 :(得分:0)

一些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;
}