C语言嵌套while循环中变量作用域导致输出差异的原因咨询
C语言嵌套while循环中变量作用域导致输出差异的原因咨询
嗨,我来帮你拆解这两段代码输出不同的核心原因——问题完全出在变量j的声明位置和初始化时机上!
先分别看两段代码的执行逻辑:
代码1的执行过程
#include <stdio.h> int main(void) { int i=0; while (i<5) { int j=1; // 重点:j在每次外层循环开始时都会被重新声明并初始化为1 while (j<=2*i+1) { printf("*"); j++; } i++; printf("\n"); } }
- 变量
j是定义在外层while循环的内部的,这意味着每次外层循环(也就是i从0到4的每一轮)开始时,都会重新创建一个全新的j变量,并且把它初始化为1。 - 每一轮外层循环里,内层while都会从
j=1开始,打印2*i+1个星号:i=0时,打印1个星号i=1时,打印3个星号i=2时,打印5个星号- 以此类推,最终输出完美的金字塔形星号。
代码2的执行过程
#include <stdio.h> int main(void) { int i=0; int j=1; // 重点:j在所有循环外部初始化,只会执行一次 while (i<5) { while (j<=2*i+1) { printf("*"); j++; } i++; printf("\n"); } }
- 变量
j是定义在所有循环之外的,它的初始化j=1只会在程序启动时执行一次,后续所有循环都会复用这个j的当前值,不会重新初始化。 - 我们一步步看执行流程:
- 第一轮外层循环(
i=0):内层条件是j<=1,打印1个星号,j变成2,然后换行。 - 第二轮外层循环(
i=1):内层条件是j<=3,此时j已经是2了,所以会再打印2个星号(j从2走到3),j变成4,换行。 - 第三轮外层循环(
i=2):内层条件是j<=5,此时j是4,打印2个星号(j从4走到5),j变成6,换行。 - 第四、第五轮循环同理,
j的当前值始终比2*i+1小2,所以每次都只会打印2个星号。
- 第一轮外层循环(
- 最终就出现了你看到的:第一行1个星号,后面四行各2个星号的结果。
简单总结:在C语言中,块级作用域内的变量(比如代码1里的j)每次进入块都会重新初始化;而外层作用域的变量(代码2里的j)只会初始化一次,后续会保留上一次修改后的值,这就是两段代码输出差异的根本原因。
备注:内容来源于stack exchange,提问作者Jayavi Chathusara
相关产品推荐
相关产品推荐

