C++中switch与do-while嵌套代码输出为何是5而非6?
为什么这段嵌套switch与do-while的C++代码输出是5而不是6?
先看完整代码:
#include <iostream> int main() { int n = 3, i=0; switch (n % 2) { case 0: do { ++i; case 1: ++i; } while (--n > 0); } std::cout << i; }
核心原因:switch的跳转逻辑+无break的代码贯穿特性
初始值:n=3,i=0。我们一步步追踪执行流程:
switch入口判断
计算n%2,3模2结果为1,所以switch直接跳转到case 1的代码位置,不会执行case 0里的++i。第一次循环执行
- 执行
case 1的++i,i变为1。 - 走到do-while的循环条件:
--n > 0,前置递减后n=2,2>0为真,循环继续,回到do的起始位置。
- 执行
第二次循环执行
- 回到do开头,先执行
case 0里的++i,i变为2。 - 因为没有
break语句,代码会贯穿到case 1,执行++i,i变为3。 - 判断循环条件:
--n >0,n变为1,1>0为真,循环继续。
- 回到do开头,先执行
第三次循环执行
- 回到do开头,执行
case 0的++i,i变为4。 - 贯穿到
case 1执行++i,i变为5。 - 判断循环条件:
--n >0,n变为0,0>0为假,循环终止。
- 回到do开头,执行
最后输出i的值就是5。
为什么会误以为是6?
很多人会默认每次循环都执行两次++i,三次循环就是6,但实际上第一次进入循环时,是通过switch直接跳转到case1,没有执行case0里的++i,只有后面两次循环才完整执行了do块里的两个++i,总执行次数是1+2+2=5。
内容的提问来源于stack exchange,提问作者Florin Drutu
相关产品推荐
相关产品推荐

