c - “for”循环中的变量范围
问题描述
到目前为止我所知道的是,块内的多个声明会产生错误消息,并且未初始化的局部变量也会在打印时产生垃圾值。
但是遇到for
C 中的循环示例动摇了我对变量范围的概念。
下面是相同的代码:
#include<stdio.h>
int main()
{
int i;
for(int i = 5; i > 0 ; i--){
int i;
printf("%d ", i);
}
}
上面的代码产生输出
0 0 0 0 0
我有两个问题
一个
for
循环被认为是一个块,那么如何为同一变量的两个声明分配两个不同的内存i
?而如果将for循环的第一行和它的主体视为两个块,那么如何识别不同的块呢?在循环体内,变量
i
未初始化,那么它如何将值设为0,因为它应该具有垃圾值?
请解释一下。
解决方案
在循环的第一部分中声明的变量的范围是加循环体for
的所有三个部分。for
在您的情况下,循环体是一个复合语句,并且您声明了i
在该块中命名的另一个变量,因此它掩盖i
了for
.
因此,在您的代码中,有三个相关范围:
main
函数体for
循环的三个部分。for
循环体。
而且它们中的每一个都是另一个“内部”的,因此在其中一个范围内声明的变量会掩盖更高范围内的同名变量。
为了进一步说明这一点,如果我们将您的代码修改如下:
int main()
{
int i = 9;
printf("outer i: %d\n", i);
for(int i = 5;i>0;printf("middle i:%d\n", i),i--){
int i = 7;
printf("inner i: %d\n",i);
}
printf("outer i: %d\n", i);
}
输出是:
outer i: 9
inner i: 7
middle i:5
inner i: 7
middle i:4
inner i: 7
middle i:3
inner i: 7
middle i:2
inner i: 7
middle i:1
outer i: 9
至于为什么你的代码在循环内打印 0,一个未初始化的变量可能有任何值,包括 0。所以仅仅因为它打印 0 并不意味着它不是垃圾。
推荐阅读
- null - Flutter/Firestore - 即使在空检查之后,FutureBuilder 也会导致 NoSuchMethodError
- c++ - QScopedPointer实现中sizeof的使用
- javascript - javascript中的对象转换数组
- c# - ajax 调用首先失败 2 次,然后从第 3 次返回成功
- c# - 我的 ASP 控件 ID 没有出现在页面后面的代码中 (C#) 如何解决这个错误?
- ionic-framework - 如何在ionic3中使用firebase登录谷歌后重定向到主页
- kubernetes - 空地址 kubernetes 入口
- javascript - JavaScript - 为什么可以在 ElectronJs 的浏览器脚本标签中使用 require 函数?
- java - 如果字符串的长度更长,如何添加空格
- mysql - 如何对数据进行分组?