gpt4 book ai didi

c - 开关盒奇怪的范围

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:21:01 25 4
gpt4 key购买 nike

在查看一些第 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 的情况下中断不存在,则答案也可能包括行为。

最佳答案

不仅有效,实际代码中也使用了类似的结构,例如 Duff's Device ,这是一个用于复制缓冲区的展开循环:

send(to, from, count)
register short *to, *from;
register count;
{
register n = (count + 7) / 8;
switch(count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while(--n > 0);
}
}

因为 switch 语句实际上只是计算一个地址并跳转到它,所以很容易看出为什么它可以与其他控制结构重叠;其他控制结构中的行也有可以作为跳转目标的地址!

在您介绍的情况下,想象一下如果您的代码中没有 switchbreak。当您执行完 if 语句的 then 部分后,您会继续执行,因此您会陷入情况 2:。现在,因为您有 switchbreak,所以 break 可以跳出什么很重要。根据MSDN page, “The C break statement” ,

The break statement terminates the execution of the nearest enclosing do, for, switch, or while statement in which it appears. Control passes to the statement that follows the terminated statement.

因为最近的封闭 doforswitchwhile 语句是您的 switch (注意 if 不包含在该列表中),然后如果您在 then block 内,则转移到 外部switch 语句。不过,更有趣的是,如果您输入 case 0,但 c == 'A' 为 false,会发生什么情况。然后 if 将控制权转移到 then block 的右大括号之后,您开始执行 case 2 中的代码。

关于c - 开关盒奇怪的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48468330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com