在C语言中混合使用'switch'和'while'

8

我最近阅读了关于奇怪的C代码片段的这个页面。其中大部分都能理解。但是我无法理解这一个:

switch(c & 3) while((c -= 4) >= 0){
    foo(); case 3:
    foo(); case 2:
    foo(); case 1:
    foo(); case 0:
}

有人能帮忙解释一下这段代码背后的逻辑吗?它是如何工作的呢?


8
http://en.wikipedia.org/wiki/Duff%27s_device - interjay
1
可能是如何编译Duff设备代码?的重复问题。 - Jongware
1
这不是有效的C语言。在每个case标签后面,您必须有一个语句。 - Nisse Engström
1个回答

5

这段代码使用了 Duff's Device 技巧,它会检查变量 c 的最后两个二进制位,然后跳转到 while 循环内对应的 case 语句。case 语句下面的代码也会被执行。然后控制流到达 while 循环的结尾,再次跳转回开头检查条件是否仍然成立。如果成立,则执行循环内所有语句,并重复循环直到条件不成立。通常情况下,初始 switch 会保证在 while 循环第一次运行时 c 是 4 的倍数。

编辑:参考 维基百科上的 Duff's Device。添加链接以更加明确我所说的 "duff's device comment"。如果您支持本答案,请考虑同时点赞 interjay 的评论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接