为何循环内重声明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
相关产品推荐
相关产品推荐

