【问题标题】:Using sets in "switch" statement [duplicate]在“switch”语句中使用集合[重复]
【发布时间】:2013-05-23 12:41:49
【问题描述】:

我可以在“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;
 }

等等。

【问题讨论】:

    标签: c++ set switch-statement


    【解决方案1】:

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

    没有。在 C++ 中,您只能打开减少为整数的事物。您需要构建一个函数来计算 1

    或者,如果您不需要 switch 为您提供的后续习惯用法(从您的示例看来,您不需要),只需使用 ifelse ifelse

    从下面的 cmets 中提取: 6.4.2-2 [stmt.switch] 条件应为整数类型、枚举类型或存在单个非显式转换函数到整数或枚举类型的类类型[...] constant-expression 应该是转换条件的提升类型的转换常量表达式(5.19)

    【讨论】:

    • 您需要构建一个函数来计算 1 可以你解释一下?听起来很有用。另外,我不想使用ifelse,因为我想用它来观看屏幕上的某些区域,这意味着要使用很多坐标。
    • @Bathsheba 您只能打开 整数 而不仅仅是 intint64_tchar 是完全可以接受的类型。
    • 您想要开启的详尽列表是什么?你有 1
    • 嘿 syam:你确定吗?我确信(就我从小到大的想法而言)在 C 中,任何大于 int 的数字都会在 switch 中引入周期性。在 C++ 中也不是这样吗?
    • @Bathsheba:不,只需将您的答案编辑为 integer 而不是 int,我会很满意。 ;)
    【解决方案2】:

    1 &lt; 50 是一个布尔表达式,它的 compile-time 值为true,因此在整数上下文中变为1。所以你最终会在你的switch 中得到两个相同的cases。以高警告级别编译 - 你的编译器肯定会抱怨。

    【讨论】:

    • 我知道1 &lt; 50不合适,我只是举例说明了代码。
    【解决方案3】:

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

    case 1:
    case 2:
        blah;
        break;
    

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

    【讨论】:

      【解决方案4】:

      对我来说,这适用于我的 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;
          }
      }
      

      感谢您在 cmets 中声明它是 GCC's extenstion

      【讨论】:

      • 不过,这是一个扩展。
      • 你说得对,重要的是要提一下,我只是想在这里有它会很好
      • GCC 4.7.2 给了我一个warning: range expressions in switch statements are non-standard (-std=c++11 -Wall -Wextra -pedantic)。
      • @syam - 是的,这是警告 (-pedantic) 通知您它不必与 gcc 分开工作,这就是为什么我在帖子中说明我的编译器版本
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        你不能在 C++ 中做到这一点。 case 开关必须是可以转换为 int 的常量。

        【讨论】:

          【解决方案7】:

          很好地讨论了here

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

          case 1+a;
          
          break;
          
          case 5;
          
          break;
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-14
            • 2014-06-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多