You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求详解switch-case嵌套do-while循环的C++程序执行流程

一步步解析这段C++代码的执行流程

我明白你的困惑——乍一看n=3时n%2=1,似乎case 0分支完全不会触发,那do-while循环怎么会跑起来?问题出在switch语句的“贯穿(fall-through)”特性,以及这段代码的特殊结构上。咱们逐行拆解:

初始状态

  • int n = 3;
  • int i = 0;

第一步:计算switch的判断条件

n % 2结果是1,所以switch直接跳转到case 1对应的代码位置。

第二步:进入case 1的执行流程

注意代码的结构:case 1嵌套在do-while循环内部,而且所有case分支都没有break语句。当跳到case 1时,首先执行:

++i;

此时i的值变为1。

接下来执行do-while的循环条件:

--n > 0

--n让n变成2,2>0为真,所以循环继续,回到do的开头。

第三步:第一次循环迭代(回到do开头)

从do的第一行开始执行:

++i;

i变为2,然后因为没有break,代码直接贯穿到case 1的逻辑:

++i;

i变为3。

再检查循环条件:--n让n变成1,1>0为真,循环继续。

第四步:第二次循环迭代

再次回到do开头:

++i;

i变为4,贯穿到case 1的逻辑:

++i;

i变为5。

检查循环条件:--n让n变成0,0>0为假,循环终止。

最后:输出结果

std::cout << i;会输出5。

关键总结

你之前的误解在于认为只有case 0会触发do-while,但实际上:

  • switch匹配到case 1后,会从case 1的位置开始执行后续所有代码(直到遇到break或switch结束)。
  • case 1的代码属于do-while循环的一部分,执行完case 1的++i后,会触发循环条件判断;当条件为真时,会回到do的开头执行代码,这就自然进入了循环流程。

这段代码的写法非常不规范,利用了switch的贯穿特性,很容易让人混淆——正常情况下,每个case分支都应该加上break来避免意外的贯穿执行。

内容的提问来源于stack exchange,提问作者Expert Learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:15:51