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

为何循环内重声明C语言变量不影响循环执行次数?

为啥你的for循环还是执行了5次?

先看你的代码:

for(int i = 0; i < 5; i++) {
    int i = 10;
    printf("%d\n", i);
}

实际运行会打印5次10,而不是你预期的只打印1次,核心原因是循环体里的i和循环头的i根本不是同一个变量。

1. 变量遮蔽(Shadowing):同名变量的作用域隔离

C语言里,每个{}包裹的块都有自己的块级作用域。当你在循环体内部再次声明int i = 10时,这个新的i会“遮蔽”外层(循环头)的同名变量:

  • 在循环体内部,所有对i的引用(比如printf里的i)都会指向这个新声明的局部变量;
  • 而循环头的i(用来控制循环次数的那个),在循环体内部是“不可见”的——或者说,被内层的i盖住了。

2. for循环的控制逻辑只认外层的i

for循环的三个核心部分:初始化int i=0、条件判断i<5、递增i++,都是在循环体的作用域之外执行的。也就是说:

  • 每次循环的条件判断,用的都是循环头声明的那个i;
  • 每次循环结束后的i++,也是给循环头的i加1;
  • 循环体里的新i完全不影响循环的控制逻辑。

所以循环头的i会从0开始,依次变成1、2、3、4,直到i=5时条件i<5不成立,循环终止——刚好执行5次。

3. 怎么改成你预期的效果?

如果你想让循环体修改控制循环的那个i,别重新声明变量,直接赋值就行:

for(int i = 0; i < 5; i++) {
    i = 10; // 去掉int,直接修改外层的i
    printf("%d\n", i);
}

这时候循环只会执行1次:第一次循环时,把外层i改成10,执行完printf后,i++把i变成11,下一次判断11<5不成立,循环直接终止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:39:51