1

我可以在“switch”语句中添加集合而不是数字吗?喜欢:

switch(number)
{
 case 1<50: //if number is between 1 and 50
 {
 blah;
 break;
 }
 case 50<100: //if number is between 50 and 100
 {
 blah;
 break;
 }

等等。

4

7 回答 7

6

(编辑以下评论,致谢用户 syam)

不可以。在 C++ 中,您只能打开减少为整数的东西。您需要构建一个函数来计算 1 < 50 和 50 < 100 等的积分结果并使用 switch(thatFunction(...))。

或者,如果您不需要 switch 为您提供的后续惯用语(从您的示例看来,您不需要),只需使用if, else if, else.

摘自以下评论: 6.4.2-2 [stmt.switch] 条件应为整数类型、枚举类型或存在单个非显式转换函数到整数或枚举类型的类类型 [... ] 常量表达式应该是转换条件的提升类型的转换常量表达式 (5.19)

于 2013-05-23T12:43:30.837 回答
2

1 < 50是一个布尔表达式,它的编译时值为true,因此成为1整数上下文。所以你最终case在你的switch. 以高警告级别编译 - 你的编译器肯定会抱怨。

于 2013-05-23T12:46:11.313 回答
1

可悲的是没有。您可以对一小组离散值使用 fall-through:

case 1:
case 2:
    blah;
    break;

但对于大范围,唯一明智的选择是if...else.

于 2013-05-23T12:45:09.623 回答
1

对我来说,这适用于我的 g++ (GCC) 4.7.2 20121109

#include <iostream>

using namespace std;

int main() {

    switch(6) {
        case 1 ... 5:
            cout << "Between 1 and 5" << endl;
            break;
        case 6 ... 10:
            cout << "Between 6 and 10" << endl;
            break;
    }
}

感谢您在评论中指出这是GCC 的扩展

于 2013-05-23T12:48:35.070 回答
0

在这里很好地讨论了这一点。

当您必须在许多可能的条件下使用单个变量时,switch 语句很有用。if-else通过使用跳转表, switch 语句的运行速度比块快。它在制作表格时需要常量整数。不允许不计算为固定值的表达式的原因是为了避免歧义。

case 1+a;

break;

case 5;

break;

现在如果a4。那会引起问题。如果它不使用跳转表,它不会比if-else块有用

于 2013-05-23T12:51:22.177 回答
0

你不能在 C++ 中做到这一点。caseswitch 必须是一个可以转换为int.

于 2013-05-23T12:44:16.710 回答
0

条件语句不允许用作 case 语句,因此您可以选择使用 if / else 语句。

于 2013-05-23T12:43:42.003 回答