Switch Fall Through Not Working as Expected
我有一个开关块,它的行为并不像我预期的那样。正如我在这个论坛上浏览过类似的问题,答案并没有直接解决我的问题,但似乎证实了我的想法。请告诉我哪里出错了。另外,我知道我可以用另一种更好的方式来完成这一任务,但这不是我想要的。我想知道我对失败的理解在哪里是错误的。
1 2 3 4 5 6 7 8
| switch (ncPointType)
{
case"MSD":
adjustDisabled = LastToken(initLine, adjustDisabled);//fall through intentional
case"MSI":
case"BI":
latchingPoint = FirstToken(initLine, latchingPoint);
break; |
现在,根据我的理解,如果ncpointtype=="msd",则应设置adjustDisabled和latchingpoint。如果"msi",则应设置latchingpoint。但是编译器将第一个"case"标记为错误"control cannot fall through from one case label(‘case"msd":’)to another.为什么此代码无效?
- 这可能会回答您的问题:链接
- 错误消息的哪些部分不清楚?C中不允许摔倒#
- @贝纳龙森:那为什么"msi"案失败了?
- @用户3642601查看我在第二条评论中链接到的问题的第一个答案
- @比那更合理。谢谢您。
- 您的错误是认为msi和bi是由空开关盒体分隔的两个不同开关段。没有从MSI到BI的"落差",因为它们是相同的部分,而不是两个具有空性的不同部分。
- 你可能会有兴趣阅读我在2009年的博客上关于这一点的文章以及switch语句中的其他三个奇怪之处:ericlippert.com/2009/08/13/four-switch-oddities
在c中,您必须明确保留有问题的case部分。您可以在第一节的末尾使用goto case"MSI";。
当然,switch块的一部分也可以以break、return、throw、无限循环(C编译器可以确定的是无限循环)等结束。
- 谢谢你真的读了我的问题,因为其他答案显然没有。你的答案是可行的,但是为什么你需要在"msd"的情况下使用goto,而不是在"msi"的情况下使用goto?我知道在"msd"下有一个声明,但我认为在声明之后它会继续顺利通过。这对我来说是没有意义的。
- 您应该阅读以下内容:msdn.microsoft.com/en-us/library/aa664749%28v=vs.71%29.aspx,尤其是以"开关段中允许有多个标签"开头的部分。
- @用户3642601在C_中,一个单独的switch部分可以有多个标签。您的示例只有两个"部分"。"标签"case"MSI"和case"BI"属于同一部分。一个部分有多个标签不被认为是贯穿的。不允许坠落。