使用排除法在C++中的switch case语句中使用范围

3

gcc中有一个扩展功能可以在switch case语句中使用"range"。

case 'A' ... 'Z':

允许在A到Z范围内匹配任何字符。
像这样的范围语句中是否可以进行“排除”?例如,假设我想匹配所有A-Z字符,但不包括“G”和“L”。

我知道一个简单的解决方案是在A-Z case的正文中处理特殊字符,但我更希望存在上述描述的解决方案。


4
这不是标准的 C++。 - Quimby
1
我了解在C++中,我可以在switch case语句中使用“range”。这是不正确的。 - François Andrieux
1
这是GCC的扩展功能:https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html - Justin
1
case 'A'...'G'-1: case 'G'+1...'L'-1: case 'L'+1...'Z': - Evg
1
重新表述问题以便得到有意义的答案。 - SergeyA
2个回答

2
char c = /* init */;

switch(c)
{
case 'A' ... ('G'-1):
case ('G'+1) ... ('L'-1):
case ('L'+1) ... 'Z':
    /* some code */;
}

但我认为一个简单的解决方案...来处理A-Z案例正文中的特殊字符

比上面的代码要好得多。

最初的回答。


1
有太多的“...”,很难理解哪些是省略号,哪些是语法的一部分。 - SergeyA
@SergeyA,希望这些注释能够帮到你。 - Evg

2

正如评论者所观察到的那样,这不是标准的C++。

我不会在我的代码中使用它。

尽管如此,在GCC的g ++中,它可以像这样工作:

Original Answer翻译成"最初的回答"

#include <iostream>

using namespace std;

int main()
{
    cout << "Case test" << endl;
    for (char c = '0'; c<'z'; c++)
    {
        switch (c)
        {
        case 'A'...('G'-1): case ('G'+1)...('L'-1): case ('L'+1)...'Z':
            cout << c;
            break;
        default:
            cout << ".";
            break;
        }
    }
}

g++ case.cpp -o case -W -Wall -Wextra -pedantic && ./case

case.cpp: In function ‘int main(int, char**)’:
case.cpp:15:9: warning: range expressions in switch statements are non-standard [-Wpedantic]
         case 'A'...('G'-1): case ('G'+1)...('L'-1): case ('L'+1)...'Z':
         ^~~~
case.cpp:15:29: warning: range expressions in switch statements are non-standard [-Wpedantic]
         case 'A'...('G'-1): case ('G'+1)...('L'-1): case ('L'+1)...'Z':
                             ^~~~
case.cpp:15:53: warning: range expressions in switch statements are non-standard [-Wpedantic]
         case 'A'...('G'-1): case ('G'+1)...('L'-1): case ('L'+1)...'Z':
                                                     ^~~~
Case test
.................ABCDEF.HIJK.MNOPQRSTUVWXYZ...............................

2
为什么你在main函数中有参数,却后来又不使用它们? - SergeyA
@SergeyA 这是一种老习惯,可以看看这个答案。你说得没错,在现代的CC++中它已经不再必要了,所以我会编辑这个答案。 - Stéphane Gourichon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接