我有一个switch语句,它基于int比较,但由于某些原因,它总是在真实的比较中失败,并跳到缺省值。下面是我的代码:
string Error(int errorNum, int send=1, int crash=1)
{
string errorType;
switch(errorNum)
{
case 10:
errorType = "Port number";
...
default:
errorType = "Unknown";
}
...
}我一直使用10的参数调用它,但是当我调用它时,它失败了。等效的if... else if... else方法可以工作,下面也是这样:
string Error(int errorNum, int send=1, int crash=1)
{
string errorType;
if (errorNum == 10) // Normally I'd use braces,
errorType = "Port number"; // but here, it just clutters
...
else
errorType = "Unknown";
...
}发布于 2013-05-17 03:02:45
在这种情况下,您可能遗漏了一个break。确保在每个case的末尾包含break,否则它将跳转到下一个。
string Error(int errorNum, int send=1, int crash=1)
{
string errorType;
switch(errorNum)
{
case 10:
errorType = "Port number";
break; // If this is not here it will fall throughto the next case or default
default:
errorType = "Unknown";
}
return errorType;
}发布于 2013-05-17 03:02:33
如果不使用break,那么所有后续的case语句都将在匹配的case之后执行。
因此,在你的案例中,它执行两个大小写部分并覆盖值errorType,这会给你一种直接跳到默认大小写的印象。
要添加有趣的更新的...
请注意,用大括号将case语句括起来不会有什么不同。实际上,以下代码是有效的C++,并且可以按预期工作:
switch(var)
{
{
case 1:
cout<<"case 1"<<endl;
}
cout<<"This is also part of case 1"<<endl;
case 2:
{
cout<<"case 2 "<<endl;
}
}请注意,大括号没有放错地方。
这里,外部cout也是case 1的一部分。在计算完控制表达式var之后,控制将直接跳转到匹配的案例。case 1周围的花括号只是引入了一个新的作用域,并不影响案例的真正构成。因此,正确的方法是,如果您不想在其余情况下出错,则将break语句放入其中。
发布于 2013-05-17 03:03:10
你在默认之前有休息时间吗?如果不是,那么它看起来就像是在触及违约,因为它将会失败。
https://stackoverflow.com/questions/16595336
复制相似问题