我有一个基于int比较的switch语句,但由于某种原因,它继续在真正的比较上失败,并跳过默认值。这是我的代码:
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";
...
}
答案 0 :(得分:4)
如果您不使用break
,那么所有后续案例陈述将在匹配案例之后执行。
因此,在您的情况下,它会执行两个案例部分并覆盖值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
的大括号只是引入了一个新的范围,并且与 case 的真正构成无关。所以正确的方法是在break
语句中添加{{1}}语句,如果你不想完成其他案例的话。
答案 1 :(得分:4)
您可能错过了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;
}
答案 2 :(得分:2)
你在违约前休息一下吗?如果没有那么它看起来就像是默认,因为它会落空。
答案 3 :(得分:1)
每个case语句都需要一个break子句,否则它将进入下一个语句。
e.g。
case 10:
errorType = "Port number";
break;
default:
errorType= "Unknown";
break;
查看http://msdn.microsoft.com/en-us/library/k0t5wee3(v=vs.80).aspx了解更多详情
根据您的情况,从交换机中返回字符串甚至可能更好。退货声明不会落空
case 10:
return "Port number";
default:
return "Unknown";