开关中错误的多个案例不会产生编译器错误
这个问题在这里已经有了答案:
只要快速查看此代码,我们认为返回值应为1,
我想说的是有经验的C ++开发人员会立即发现,什么是错的,并很快得出结论,其他一些程序员不小心用逗号: ,
但在执行过程中它返回3。
不,代码不能编译 ,因为case表达式不是常量
事实上,它不会在任何半路现代编译器中编译。 例如,MSVC 2013说:
stackoverflow.cpp(8) : error C2051: case expression not constant
stackoverflow.cpp(10) : error C2051: case expression not constant
像1, 2
这样的表达式是逗号运算符的应用程序,并且逗号运算符暗示该表达式不是编译时常量。
至少在C ++ 11出现之前,放宽了规则,即添加括号(即case (1, 2):
:)将被允许编译。 它只是不会做你期望的。
这在开关中的多个案例中部分回答:
怎么会这样? 其他问题和答案几乎完全是关于C#,而不是关于C ++。
我想知道为什么不正确的窗体编译时没有错误或事件警告(至少在Borland C ++编译器中)。
因为编译器太旧了。 最好换个新的。
我的猜测是,在第一种情况下,编译器评估逗号运算符以导致代码被执行,如下所示:
switch(variable)
{
case 2:
return 1;
case 4:
return 2;
default:
return 3;
}
从上面可以看出为什么值3返回输入1.我建议你阅读一下逗号操作符。 与它有关的SO有一些优秀的线索。
a, b
在C和C ++中都是有效的表达式。 它的意思是“评估a
,放弃它,评估b
”。 表达式的值是b
。 所以你原来的switch
有以下含义:
variable = 1;
switch(variable)
{
case 2:
return 1;
case 4:
return 2;
default:
return 3;
}
有关逗号运算符的更多信息,请参阅Wikipedia文章。
链接地址: http://www.djcxy.com/p/84457.html上一篇: Incorrect Multiple Cases in Switch not generating compiler error