全局变量与局部变量重名
- 函数内部定义的局部变量与全局变量重名时,函数在使用该变量的时候会以局部变量覆盖全局变量。也就是只有局部变量会起效果。在此定义域中赋值等操作时都不会使用到全局变量。
- 在main函数或其他函数里定义了局部变量,同时同名的全局变量同时也存在,当调用一个使用了该变量的函数(该变量在此函数中无定义)时,函数会使用全局变量。而不是main或其他函数中定义的同名变量。例如
-
#include <stdio.h> #include <stdlib.h> int n=5; void fun(int m) { int n=1; if(m<10) { fun(m+1); printf("%d ",n++); } }
void print() { printf("%d\n",n); }
/*void printm()
{
printf("%d\n",m)
}*/
int main() { int n; scanf("%d",&n); printf("%d\n",n); print(); fun(n);
// int m=10;
// printm(); return 0; }输入3时, 运行结果为: 3 5 ,1 1 1 1 1 1 1 。(以上注释掉的部分为测试使用)
-
- 当第一次输出的时候,只是调用输出了在main()函数里边定义的n,所以当输入3时,只有main里边定义的n被改变成为3,然后下一句输出n就直接输出的是上边刚刚赋值了的3。
- 调用print函数时输出的结果为5,虽然print函数里只有一句printf(),看似与上边的输出语句并无其他区别,但此时print函数只能得到全局变量n,虽然在main函数里有对print()函数的调用,但是print()函数与main函数还是属于两个作用域,main中定义的局部变量n并不能影响print()函数中对n的使用,所以print函数使用的还是全局变量n。
- 在递归函数fun()中,每次都对声明局部变量n=1,然后每次函数发生递归的时候printf()函数中都会对n进行++操作,然而输出的全是1,这是由于当函数发生递归的时候调用自己,但是每次调用printf()函数时候,都使用的是自己的局部变量n=1,并不会受上一层n的影响也不会影响到上一层的n,更不会受全局变量n=5的影响。
- 我们假设当无全局变量,只有函数自己定义的局部变量的时候,函数调用printm()函数输出m,看能不能输出main中定义的m的值,结果连编译都过不了,因为对于printm()函数来说,这个m到底是个啥东西啊,查找周围并没有对m的定义,(然而并不查找到人家main函数里边去)。所以对于函数来说首先是自己定义的局部变量,其次是大家共有的全局变量。即使是递归,各自层的变量之间也不会相互影响。