【问题标题】:Switch always runs the same case statement Xcode 5 [closed]Switch总是运行相同的case语句Xcode 5 [关闭]
【发布时间】:2013-12-10 16:59:06
【问题描述】:

所以我有一个随机词生成器,它使用一个开关将一个词随机分配给一个变量。

但是,经过一些测试,我发现它总是运行“案例 2”而不是案例 0 , 1 或默认值。

这是我的代码:

int randWord1 = rand() % 2;
switch (randWord1) {
    case 0:
        mainTextView.text = @"1";


    case 1:
        mainTextView.text = @"2";


    case 2:
        mainTextView.text = @"3";

    break;

    default:
    break;
}

编辑:

在因代码中的拼写错误关闭问题后,我发现问题在于我忘记在每个 case X: 语句后添加 break; 语句。

【问题讨论】:

  • 请使用实际相关的标签(例如所使用的语言)更新您的标签。
  • 这可能适用于 3 种情况,但对于较长的列表来说这不是一个好方法。相反,您应该将单词放入数组中,并将随机数传递给 objectAtIndex: 以获取随机单词。

标签: objective-c switch-statement xcode5


【解决方案1】:

这就是你所缺少的:

Case 0 {
mainTextView.text = @"1";
break;
}

Case 1 {
mainTextView.text = @"2";
break;
}

Case 2 {
mainTextView.text = @"3";
break;
}
Default:

注意每个Case x 中的break

C 中,如果您没有在下一个Case 之前放置正确的break 语句,每个案例都会执行。在您的情况下,由于Case 2 是其中包含任何可执行语句的最后一种情况,您将始终看到mainTextView.text 被设置为3。如果,为了争论,你有

Default: {
mainTextView.text = @"foo";
break;
}

你会看到每次都打印foo,因为在Case 2:之后没有break

【讨论】:

  • 哦!谢谢,我认为中断超出了括号
  • 这无关紧要,只要它们存在于案例的可执行范围内
  • 我必须在每个 case 语句后面加上 {} 吗?
  • 据我所知这不是必需的,但有助于提高可读性。
【解决方案2】:

你必须在每个案例之后打破,即使它看起来违反直觉/不必要。

【讨论】:

  • 我想我可能已经这样做了......但只是澄清一下当你休息时会打破:?
  • 是的,正确的。在每个 case 执行其逻辑之后,一个 break;在下一个 case 保证退出 switch 之前。
  • 是的,但为什么总是运行case 2?!
  • C 有一个怪癖,如果没有中断,switch 将继续运行所有 case 语句。所以无论 case 是 0、1 还是 2,它都会一直运行到 2,从而设置那个结果。实际上,这被称为 Duff 设备的技巧所利用。 en.wikipedia.org/wiki/Duff's_device
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2020-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
相关资源
最近更新 更多