c++ int switch语句总是指向' default '

c++ int switch statement always goes to `default`

本文关键字:default int switch 语句 c++      更新时间:2023-10-16

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

您可能在这种情况下缺少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;
}

如果不使用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。case 1周围的大括号只是引入了一个新的作用域,与大小写真正构成的内容无关。所以正确的方法是把break语句,如果你不想通过其余的情况。

您在默认之前有休息吗?如果没有,那么它就会看起来像在点击默认,因为它会掉下去。

每条case语句都需要一个break子句,否则会跳到下一条语句。

   case 10: 
        errorType = "Port number";
        break;
    default: 
        errorType= "Unknown";
        break;

查看http://msdn.microsoft.com/en-us/library/k0t5wee3(v=vs.80).aspx了解更多细节

根据您的情况,甚至可能更好地从开关中返回字符串。return语句不会通过

case 10: 
     return "Port number";
default: 
     return "Unknown";