给出以下代码:
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循环之外定义的变量i
和j
的范围和访问可能性是如何变化的。使用gcc -std=c11 -o
答案 0 :(得分:1)
在您的代码中,您已经定义了i
和j
的多个实例(每个实例占用自己的内存空间)。至少这导致难以理解和不可维护的代码:
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)
简单地说,你做不到。
当您在特定范围内定义具有与更高范围的变量相同名称的变量时,将屏蔽更高范围的变量。在下限范围超出范围之前,无法访问更高范围的变量。
您需要为这些变量指定不同的名称,以便能够访问所有这些变量。