案例;错误列表“会发生什么? 我是C++的新手。据我所知,大概是 switch(ival) { case 1,2,3: /* do something */ /* other case selections */ }

案例;错误列表“会发生什么? 我是C++的新手。据我所知,大概是 switch(ival) { case 1,2,3: /* do something */ /* other case selections */ },c++,switch-statement,C++,Switch Statement,这是错误的。正确的方法是写: switch(ival) { case 1: case 2: case 3: // in multiple lines if you prefer /* do something */ /* other case selections */ } 也就是说(希望它是正确的),编译第一个时会发生什么?Visual Studio intellisense检测到错误,但程序编译正常 我做了一些实验,我打赌如果ival是1,他会执行“做点什么”,但如

这是错误的。正确的方法是写:

switch(ival)
{
    case 1: case 2: case 3: // in multiple lines if you prefer
    /* do something */
    /* other case selections */
}
也就是说(希望它是正确的),编译第一个时会发生什么?Visual Studio intellisense检测到错误,但程序编译正常

我做了一些实验,我打赌如果ival是1,他会执行“做点什么”,但如果是2或3,他不会。我已经设置了类似这样的多个case语句,每个人都有自己的控制变量来跟踪执行,但似乎什么都没有发生,因为他们都在程序结束时保持初始化值


我很困惑。有人知道幕后会发生什么吗?

当编译器看到case语句
case N
时,它总是将
N
解释为一个整数。在本例中,编译器将表达式
1,2,3
计算为3。只有当
ival
为3时,才会执行您的
/*do something*/
代码。(使用MSVS2015进行测试)


正如您所指出的,此表达式不是表示您希望多个案例由同一代码处理的正确方式,您应该期望其他编译器以不同的方式处理这种情况。

@NathanOliver GCC&Clang,因此我认为这可能是MSVC扩展或错误。@HolyBlackCat重新打开。对我来说,第二个代码工作正常。有什么问题?还有,在程序结束时,它们都保留初始化值是什么意思?我想猜测一下,MSVC将其视为逗号运算符,但结果应该是3,而不是1。奇怪。你能在
/*做点什么*/
中填上你尝试过的,尝试时看到的,以及你期望的吗?