首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ int switch语句始终转到`default`

c++ int switch语句始终转到`default`
EN

Stack Overflow用户
提问于 2013-05-17 02:59:00
回答 4查看 4.8K关注 0票数 2

我有一个switch语句,它基于int比较,但由于某些原因,它总是在真实的比较中失败,并跳到缺省值。下面是我的代码:

代码语言:javascript
复制
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方法可以工作,下面也是这样:

代码语言:javascript
复制
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";
  ...
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-17 03:02:45

在这种情况下,您可能遗漏了一个break。确保在每个case的末尾包含break,否则它将跳转到下一个。

代码语言:javascript
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2013-05-17 03:02:33

如果不使用break,那么所有后续的case语句都将在匹配的case之后执行。

因此,在你的案例中,它执行两个大小写部分并覆盖值errorType,这会给你一种直接跳到默认大小写的印象。

要添加有趣的更新的...

请注意,用大括号将case语句括起来不会有什么不同。实际上,以下代码是有效的C++,并且可以按预期工作:

代码语言:javascript
复制
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语句放入其中。

票数 4
EN

Stack Overflow用户

发布于 2013-05-17 03:03:10

你在默认之前有休息时间吗?如果不是,那么它看起来就像是在触及违约,因为它将会失败。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16595336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档