for循环中的变量范围

时间:2016-02-26 19:10:23

标签: c loops variables scope

给出以下代码:

int main(){
    int i = 0, int j = 0; 
    for(int i = 0; i < 10; i++){
        static int j = 0;
        j++;
        printf("j: %d, i: %d \n", j,i);
    }
    printf("j: %d, i: %d \n", j,i);
    return 0;
}

产生输出:

j: 1 i: 0 
j: 2 i: 1 
j: 3 i: 2 
j: 4 i: 3
j: 5 i: 4 
j: 6 i: 5 
j: 7 i: 6 
j: 8 i: 7 
j: 9 i: 8 
j: 10 i: 9 
j: 0, i: 0 

我想知道在主文件的for循环之外定义的变量ij的范围和访问可能性是如何变化的。使用gcc -std=c11 -o

进行编译,链接和测试

2 个答案:

答案 0 :(得分:1)

在您的代码中,您已经定义了ij的多个实例(每个实例占用自己的内存空间)。至少这导致难以理解和不可维护的代码:

 int i = 0, int j = 0; //i & j defined here
    for(int i = 0; i < 10; i++){//and new i here
        static int j = 0;//new j defined here with new block scope.

关于范围:此代码段没有意义,只是为了说明i每次出现都是一个单独的变量,因为块范围,每个都有自己的内存位置:(其中块范围)是使用括号{...}

创建的
int main(void) {

    int i = 2; //will remain == to 2
    if(1)
    {//new scope, variables created here with same name are different
        int i = 5;//will remain == 5
        for(int i = 8;;)
        {//new scope again, variable with same name is not the same
            int i = 0;
        }
        i = 20;// which i is it that we just changed here?
    }
    i = 30;// or here?

    return 0;
}

带走不是为了做到这一点。使用具有适当范围的唯一且具有描述性的名称来避免这种歧义。

  

...如何访问for循环外部定义的变量i和j   主文件......

示例1:如果使用全局范围声明变量(例如,在.c文件中的函数之外),则可以在文件中的任何位置访问它们:

<强> File.c

...
int gI=0, gJ=0; //defined with file global scope outside of a function
void another_func(void); 
...
int main(){

    for(gI = 0; gI < 10; gI++){

        gJ++;
        printf("gJ: %d, gI: %d \n", gJ,gI);
    }
    printf("gJ: %d, gI: %d \n", gJ,gI);//values printed here...
    another_func();
    return 0;
}
void another_func(void)
{
    printf( "gI = %d\ngJ = %d\n", gI, gJ);//...are the same here
}

示例2:或者,您可以在头文件中声明带有 extern 范围的变量,在该文件中可以在包含该标题的任何文件中访问这些变量档案:

<强> file.h

...
extern int gI; //declared here, with extern scope (can see and use in another file)
extern int gJ; //ditto
void another_func(void);//prototype callable from multiple .c files
...

<强> File.c

#include "file.h"
...
int gI=0; // initialize extern (only one time) before using anywhere.
int gJ=0; // The values of these variables are visible in any .c file
          // that #includes the header that they were created in.
...
int main(){

    for(gI = 0; gI < 10; gI++){

        gJ++;
        printf("gJ: %d, gI: %d \n", gJ,gI);
    }
    printf("gJ: %d, gI: %d \n", gJ,gI);//values printed here...
    another_func();//...are the same here
    return 0;
}

<强> file2.c中

#include "file.h"
...
void another_func(void)
{
    printf( "gI = %d\ngJ = %d\n", gI, gJ);//extern scope variables accessible here
}

答案 1 :(得分:0)

简单地说,你做不到。

当您在特定范围内定义具有与更高范围的变量相同名称的变量时,将屏蔽更高范围的变量。在下限范围超出范围之前,无法访问更高范围的变量。

您需要为这些变量指定不同的名称,以便能够访问所有这些变量。