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

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的当前值,不会重新初始化。
  • 我们一步步看执行流程:
    1. 第一轮外层循环(i=0):内层条件是j<=1,打印1个星号,j变成2,然后换行。
    2. 第二轮外层循环(i=1):内层条件是j<=3,此时j已经是2了,所以会再打印2个星号(j从2走到3),j变成4,换行。
    3. 第三轮外层循环(i=2):内层条件是j<=5,此时j是4,打印2个星号(j从4走到5),j变成6,换行。
    4. 第四、第五轮循环同理,j的当前值始终比2*i+1小2,所以每次都只会打印2个星号。
  • 最终就出现了你看到的:第一行1个星号,后面四行各2个星号的结果。

简单总结:在C语言中,块级作用域内的变量(比如代码1里的j)每次进入块都会重新初始化;而外层作用域的变量(代码2里的j)只会初始化一次,后续会保留上一次修改后的值,这就是两段代码输出差异的根本原因。

备注:内容来源于stack exchange,提问作者Jayavi Chathusara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 08:23:02