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

问题描述 投票:6回答:10

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

我的问题是:

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

例:

switch(userInputtedInt)
{
    case >= someNum && <= someOtherNum
    break;
    // Is this possible?
}
c++ switch-statement
10个回答
12
投票

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


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

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

7
投票

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

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

当然,您可以将其纳入switch声明中:

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

3
投票

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


1
投票

或者你也许可以这样做

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

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


0
投票

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

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

}

0
投票

C ++不支持这一点。

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

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

这些值必须是不变的。


0
投票

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

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


0
投票

该标准不允许这样做:

6.4.2 switch语句[stmt.switch]

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

case constant-expression :

其中constant-expression应为整数常量表达式(5.19)。

© www.soinside.com 2019 - 2024. All rights reserved.