Switch中不正确的多个案例不会生成编译器错误

Jul*_*ano 5 c++

我知道这段代码不能用作"预期".只是快速查看此代码,我们认为返回值应为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)

在Switch中的多个案例中部分回答了这个问题:

我想知道为什么不正确的表单编译没有错误甚至警告(至少在Borland C++编译器中).

编译器在该代码中理解什么?

Chr*_*ckl 8

快速查看此代码,我们认为返回值应为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++编译器中).

因为编译器太旧了.最好换一个新的.