为何这段代码输出0223?for循环中case 2为何被执行两次?
代码输出0223及case 2执行两次的原因解析
嘿,我来帮你拆解这段代码的执行逻辑,搞懂这两个问题其实很简单,咱们逐次看循环里的每一次迭代:
先把代码贴出来方便对照:
for (int x = 0; x <4; x++) { switch (x) { case 2: printf("%d", x); case 0: printf("%d", x); default: break; case 3: printf("%d", x); } }
逐次迭代分析:
- x=0时:
switch匹配到case 0,执行printf("%d", 0)输出0。因为case 0后面没有break语句,程序会继续往下走,直到遇到default: break;才跳出switch,这次迭代结束。 - x=1时:
switch里没有对应case 1的分支,直接走到default: break;,跳出switch,没有任何输出。 - x=2时:
switch匹配到case 2,先执行printf("%d", 2)输出第一个2。这里要划重点:C语言的switch分支里,如果某个case后面没有写break,就会触发**贯穿(fall through)**特性——程序不会跳出switch,而是继续执行后续所有case的代码,直到遇到break或者switch块结束。
所以接下来程序会走到case 0,执行printf("%d", 2)输出第二个2,然后遇到default: break;才跳出switch。这就是你觉得case 2被执行两次的原因,其实是case 2的代码执行一次后,贯穿到case 0的代码又执行了一次,并非case 2本身被执行两次。 - x=3时:
switch匹配到case 3,执行printf("%d", 3)输出3。因为case 3后面没有其他语句,switch自然结束,这次迭代完成。
把所有输出按顺序连起来,就是0+22+3,也就是最终的0223。
内容的提问来源于stack exchange,提问作者Ozymandias
相关产品推荐
相关产品推荐

