C语言switch-case的一些特性
Duff注意到C语言中switch-case语句的一些特性:
- • case语句后面的break语句不是必须的。
- • 在switch语句内,case标号可以出现在任意的子语句之前,甚至运行出现在if、for、while等语句内。
于是,Duff便利用switch-case的特性,用来处理第一个while循环之后仍然剩余的count % 8
个字节的数据。
解释下这段代码:
我们假设count = 20
,那么:
n = (count + 7) / 8 = 27 / 8 = 3 count % 8 = 4
所以:
- 1. switch语句会落入
case 4
的标签内,然后依次执行了case 4、3、2、1
四条语句。自此之后,其实就跟switch-case语句再也没有关系了。 - 2. while语句判断
--n > 0
,条件成立,于是跳转到case 0
进入循环体执行,于是依次执行case 0、7、6、5、4、3、2、1
一共8条语句。此时n = 2
. - 3. 再次进入while语句处判断
--n >0
,条件成立,再次跳转到case 0
处进入循环体执行。此时n = 1
。 - 4. 此时,while语句处判断
--n >0
,条件失败,退出循环,函数结束。
好了,到这里,大家应该理解Duff's Device了吧?还是不清楚的话,可以尝试单步跟踪一下,就会很清晰了。
揭晓答案
理解了Duff's Device之后,文章开头的那个题目就很好理解了,现在揭晓答案:
编译运行:代码不提供,谢谢😊
所以,答案是:20