我知道这段代码不能用作"预期".只是快速查看此代码,我们认为返回值应为1,但在执行时它返回3.
// incorrect
variable = 1;
switch (variable)
{
case 1, 2:
return 1;
case 3, 4:
return 2;
default:
return 3;
}
Run Code Online (Sandbox Code Playgroud)
并且有一些正确的选项可以做到这一点:
// correct 1
variable = 1;
switch (variable)
{
case 1: case 2:
return 1;
case 3: case 4:
return 2;
default:
return 3;
}
Run Code Online (Sandbox Code Playgroud)
要么
// correct 2
switch (variable)
{
case 1:
case 2:
return 1;
case 3:
case 4:
return 2;
default:
return 3;
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么不正确的表单编译没有错误甚至警告(至少在Borland C++编译器中).
编译器在该代码中理解什么?
快速查看此代码,我们认为返回值应为1,
我要说一位经验丰富的C++开发人员会立即注意到出现了问题并很快得出结论,其他程序员偶然会尝试使用逗号运算符: ,
但在执行中它返回3.
不,代码不能编译,因为case表达式不是常量
事实上,它不会在任何中途的现代编译器中编译.例如,MSVC 2013说:
stackoverflow.cpp(8) : error C2051: case expression not constant
stackoverflow.cpp(10) : error C2051: case expression not constant
Run Code Online (Sandbox Code Playgroud)
表达式就像1, 2是逗号运算符的应用程序,逗号运算符意味着表达式不是编译时常量.
至少直到C++ 11走过来,放松的规则到添加括号,即效果case (1, 2):,将被允许进行编译.它只是不会做你所期望的.
在Switch中的多个案例中部分回答了这个问题:
怎么会这样?另一个问题和答案几乎完全是关于C#,而不是关于C++.
我想知道为什么不正确的表单在没有错误或事件警告的情况下编译(至少在Borland C++编译器中).
因为编译器太旧了.最好换一个新的.
| 归档时间: |
|
| 查看次数: |
294 次 |
| 最近记录: |