有没有办法在不case value:反复陈述的情况下通过多个案例陈述?
我知道这有效:
switch (value)
{
case 1:
case 2:
case 3:
//do some stuff
break;
case 4:
case 5:
case 6:
//do some different stuff
break;
default:
//default stuff
break;
}
Run Code Online (Sandbox Code Playgroud)
但是我想做这样的事情:
switch (value)
{
case 1,2,3:
//Do Something
break;
case 4,5,6:
//Do Something
break;
default:
//Do the Default
break;
}
Run Code Online (Sandbox Code Playgroud)
这是我用不同的语言思考的语法,还是我错过了什么?
逗号运算符如何在C++中工作?
例如,如果我这样做:
a = b, c;
Run Code Online (Sandbox Code Playgroud)
最终是否等于b或c?
(是的,我知道这很容易测试 - 只是在这里记录,以便有人快速找到答案.)
更新: 此问题在使用逗号运算符时暴露了细微差别.只是记录下来:
a = b, c; // a is set to the value of b!
a = (b, c); // a is set to the value of c!
Run Code Online (Sandbox Code Playgroud)
这个问题实际上是受到代码中的拼写错误的启发.打算做什么
a = b;
c = d;
Run Code Online (Sandbox Code Playgroud)
转换成
a = b, // <- Note comma typo!
c = d;
Run Code Online (Sandbox Code Playgroud) 我收到了一个问题,并被要求提供输出.
int main(void){
int x = 2;
switch(x){
case 1,2,1: printf("Case 1 is executed");
break;
case 2,3,1: printf("Case 2 is executed");
break;
default : printf("Default case us executed");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在Turbo C中给出了"Case 1 is execution"的输出,但是在代码块和在线编译时,它给出了编译器错误.
哪一个是正确的?这是编译器错误吗?如果没有,为什么代码只在Turbo C上运行?
在针对C++ 11的SO上回答这个问题的过程中,我意识到在C++ 03(以及C)中,在常量表达式中明确禁止使用逗号运算符.
关于常量表达式的C++ 03标准的第5.19/1段说:
[...]特别是,除了sizeof表达式,不应使用函数,类对象,指针或引用,并且不得使用赋值,递增,递减,函数调用或逗号运算符.
但是,在C++ 11中,提到逗号运算符的最后一部分似乎已经消失了.虽然C++ 11标准的第5.19/2段明确规定赋值,递增,递减和非constexpr函数调用表达式不应作为常量表达式的子表达式出现,但逗号运算符的使用似乎不一致被禁止了.
例如,以下程序在GCC 4.7.2和Clang 3.3上编译良好std=c++11(除了编译器警告说逗号运算符没有效果且x和arr变量未使用):
int main()
{
constexpr int x = (0, 42);
int arr[(0, 42)];
}
Run Code Online (Sandbox Code Playgroud)
但是,必须要说的是,即使是以下程序也可以使用-std=c++03选项(在Clang和GCC上)编译好,这显然是不正确的,考虑到C++ 03标准的上述引用:
int main()
{
int arr[(0, 42)];
}
Run Code Online (Sandbox Code Playgroud)
题:
关于逗号运算符是否允许在常量表达式中,或者我是否遗漏了某些内容,C++ 03和C++ 11之间是否存在差异?
作为一个奖励(非建设性)问题,我有兴趣知道为什么逗号运算符不能用在C++ 03中的常量表达式中.
c++ comma-operator language-lawyer constant-expression c++11