【发布时间】:2013-06-19 13:16:07
【问题描述】:
查看一些第 3 方 C 代码时,我遇到了类似的情况:
switch (state) {
case 0:
if (c=='A') { // open brace
// code...
break; // brace not closed!
case 1:
// code...
break;
} // close brace!
case 2:
// code...
break;
}
我正在查看的代码中似乎只是一个错字,但令我惊讶的是它编译时没有出现错误。
为什么这是有效的 C?
与在预期位置关闭大括号相比,此代码的执行有什么影响?
有什么情况可以使用吗?
编辑:在示例中,我查看了所有中断(如上) - 但答案也可能包括在情况 0 或 1 中不存在中断时的行为。
【问题讨论】:
-
嗯,这是因为
switch-case的奇怪goto label实现。虽然您的特定案例可能有点奇怪并且难以提出用例(尽管请查看 Duff's Device),但失败案例的一般概念(当您离开break时)确实可以很有用。 -
如果您现在想了解 Duff 的设备 的工作原理,here 是一些。
-
在这种情况下,
case 1:被编译器视为单独的标签。语法完全有效,但几乎可以肯定(从上下文中)在这种情况下存在逻辑错误。通过发送state ==1进行测试,您将看到不正确的结果。
标签: c syntax switch-statement duffs-device