gcc中有一个扩展功能可以在switch case语句中使用"range"。
case 'A' ... 'Z':
允许在A到Z范围内匹配任何字符。
像这样的范围语句中是否可以进行“排除”?例如,假设我想匹配所有A-Z字符,但不包括“G”和“L”。
我知道一个简单的解决方案是在A-Z case的正文中处理特殊字符,但我更希望存在上述描述的解决方案。
char c = /* init */;
switch(c)
{
case 'A' ... ('G'-1):
case ('G'+1) ... ('L'-1):
case ('L'+1) ... 'Z':
/* some code */;
}
但我认为一个简单的解决方案...来处理A-Z案例正文中的特殊字符
比上面的代码要好得多。
最初的回答。
正如评论者所观察到的那样,这不是标准的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...............................
case 'A'...'G'-1: case 'G'+1...'L'-1: case 'L'+1...'Z':
- Evg