首页 > 解决方案 > “for”循环中的变量范围

问题描述

到目前为止我所知道的是,块内的多个声明会产生错误消息,并且未初始化的局部变量也会在打印时产生垃圾值。

但是遇到forC 中的循环示例动摇了我对变量范围的概念。

下面是相同的代码:

#include<stdio.h>

int main()
{
    int i;
    for(int i = 5; i > 0 ; i--){
        int i;
        printf("%d ", i);
    }
}

上面的代码产生输出

0 0 0 0 0

我有两个问题

  1. 一个for循环被认为是一个块,那么如何为同一变量的两个声明分配两个不同的内存i?而如果将for循环的第一行和它的主体视为两个块,那么如何识别不同的块呢?

  2. 在循环体内,变量i未初始化,那么它如何将值设为0,因为它应该具有垃圾值?

请解释一下。

标签: cfor-loopscope

解决方案


在循环的第一部分中声明的变量的范围是加循环体for的所有三个部分。for在您的情况下,循环体是一个复合语句,并且您声明了i在该块中命名的另一个变量,因此它掩盖ifor.

因此,在您的代码中,有三个相关范围:

  1. main函数体
  2. for循环的三个部分。
  3. 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 并不意味着它不是垃圾。


推荐阅读