切换案例中的逗号

时间:2017-03-06 06:09:01

标签: c++ switch-statement case comma

我对输入和输出感到困惑,任何人都可以告诉我为什么会得到这样的输出。

#include<iostream>
#include<stdlib.h>
using namespace std;

int main()
{
    int ival, oddcnt(0), evencnt(0);
    while (cin >> ival) {
        switch (ival) {
        case 1, 3, 5, 7, 9:
            oddcnt++;
            break;
        case 2, 4, 6, 8, 10:
            evencnt++;
            break;
        }
    }
    cout << "Quantity of odd number:" << oddcnt << "\n"
        << "Quantity of even number:" << evencnt << endl;
    system("pause");
    return 0;
}

这是我得到的结果: 输入:1 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 6 6 6 7 7 7 7 8 8 9 9 10 10 10 EOF 输出:奇数的数量:2        偶数量:3 enter image description here

4 个答案:

答案 0 :(得分:4)

case标签中逗号的这种用法在标准C ++中是非法的。这在语法上是不正确的。符合标准的编译器必须发出诊断消息以响应此代码,即使它以某种方式接受它。

可能(或可能不会)涉及一些错综复杂的细节。

  • 在原始的C ++ 98语言中,禁止在case标签中使用逗号运算符。它被阻止了#34;通过语言规范的两个不同部分:

    首先,constant-expression的语法不允许在常量表达式中使用顶级逗号运算符。在语法上,逗号运算符只能出现在()

    中的常量表达式中

    其次,C ++ 98规范明确禁止在嵌套()的任何级别的常量表达式中使用逗号运算符(见5.19 / 1)。

    (这与C语言要求基本相同。)

  • 但是,C ++ 11进行了一些更改:allowed comma operator in constant expressions。然而,语法保持不变。这意味着现在允许逗号运算符用于常量表达式,但仅限于()中。例如。从C ++ 11开始,您可以使用

    case (1, 3, 5, 7, 9):
    

    这是逗号运算符的普通应用程序。它使整个事情等同于

    case 9:
    

同时,你的

    case 1, 3, 5, 7, 9:
到目前为止,

在C ++中仍然是非法的。如果您的编译器以某种方式支持它,它必须是您的编译器实现的语言扩展。请查阅编译器文档以确定其含义。

根据您获得的输出判断,您的编译器将case 1, 3, 5, 7, 9:视为等同于case (1, 3, 5, 7, 9):,因此等同于case 9:。这解释了输出。该程序只计算输入中的910 s。您有两个9和三个10

另见:
Is the comma operator allowed in a constant-expression in C++11?
Why was the restriction on the comma operator being in a constant expression removed in C++11?

答案 1 :(得分:2)

您可以在开关内尝试此操作:

switch (ival) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 9:
     oddcnt++;
     break;

    case 2:
    case 4:
    case 6:
    case 8:
    case 10:
     evencnt++;
     break;
}

答案 2 :(得分:0)

switch (var) {
    case value1: /* ... */ break;
    case value2: /* ... */ break;
    /* ... */
}

答案 3 :(得分:0)

 switch (ival) {
        case 1, 3, 5, 7, 9:
            oddcnt++;
            break;
        case 2, 4, 6, 8, 10:
            evencnt++;
            break;
        }

案例1,3,5,7,9: 这种类型的switch语句会导致语法错误,但在你的情况下却没有。

语法错误(编译器gcc版本5.4.0(GCC)上的 ):

error: expected ‘:’ before ‘,’ token  
       case 1, 3, 5, 7, 9:
             ^
error: expected ‘:’ before ‘,’ token
     case 2, 4, 6, 8, 10:
           ^
error: expected primary-expression before ‘,’ token

尽管如此,您可以尝试以下开关案例:

switch (ival) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 9:
            oddcnt++;
            break;
        case 2:
        case 4:
        case 6:
        case 8:
        case 10:
            evencnt++;
            break;
        }