它不仅有效,而且在实际代码中也使用了类似的结构,例如,达夫的装置 http://en.wikipedia.org/wiki/Duff%27s_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);
}
}
Since a switch
语句实际上只是计算一个地址并跳转到它,很容易看出为什么它可以与其他控制结构重叠;其他控制结构中的行也有可以作为跳转目标的地址!
在您提出的情况下,想象一下如果没有switch
or break
在你的代码中。当你完成执行后then
的一部分if
声明,你只要继续前进,那么你就会陷入困境case 2:
。现在,既然你已经有了switch
and break
,这很重要break
可以挣脱出来。根据MSDN 页面,“C break 语句” http://msdn.microsoft.com/en-us/library/wt88dxx6%28v=vs.80%29.aspx,
The break语句终止最近的封闭语句的执行do, for, switch, or while它出现的声明。控制权传递到终止语句后面的语句。
由于最近的封闭do, for, switch, or while声明是你的switch(请注意if不包含在该列表中),那么如果您在then
块,你转移到外面switch
陈述。不过,更有趣的是,如果您输入,会发生什么case 0
, but c == 'A'
是假的。然后if
将控制权转移到右大括号之后then
块,然后您开始执行中的代码case 2
.