c ++ int switch语句总是转到`default`

时间:2013-05-16 18:59:00

标签: c++ int switch-statement

我有一个基于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";
  ...
}

4 个答案:

答案 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";