全局变量与局部变量重名
函数printf作用1. 函数内部定义的局部变量与全局变量重名时,函数在使⽤该变量的时候会以局部变量覆盖全局变量。也就是只有
局部变量会起效果。在此定义域中赋值等操作时都不会使⽤到全局变量。
2. 在main函数或其他函数⾥定义了局部变量,同时同名的全局变量同时也存在,当调⽤⼀个使⽤了该变量的函数
(该变量在此函数中⽆定义)时,函数会使⽤全局变量。⽽不是main或其他函数中定义的同名变量。例如
1. #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 。(以上注释掉的部分为测试使⽤)
3. 当第⼀次输出的时候,只是调⽤输出了在main()函数⾥边定义的n,所以当输⼊3时,只有main⾥边定义的n被
改变成为3,然后下⼀句输出n就直接输出的是上边刚刚赋值了的3。
4. 调⽤print函数时输出的结果为5,虽然print函数⾥只有⼀句printf(),看似与上边的输出语句并⽆其他区别,但
此时print函数只能得到全局变量n,虽然在main函数⾥有对print()函数的调⽤,但是print()函数与main函数还是属于两个作⽤域,main中定义的局部变量n并不能影响print()函数中对n的使⽤,所以print函数使⽤的还是全局变量n。
5. 在递归函数fun()中,每次都对声明局部变量n=1,然后每次函数发⽣递归的时候printf()函数中都会对n进⾏++操作,然⽽输出的全是1,这是由于当函数发⽣递归的时候调⽤⾃⼰,但是每次调⽤printf()函数时候,都使⽤的是⾃⼰的局部变量n=1,并不会受上⼀层n的影响也不会影响到上⼀层的n,更不会受全局变量n=5的影响。
6. 我们假设当⽆全局变量,只有函数⾃⼰定义的局部变量的时候,函数调⽤printm()函数输出m,看能不能输出main中定义的m的值,结果连编译都过不了,因为对于printm()函数来说,这个m到底是个啥东西啊,查周围并没有对m的定义,(然⽽并不查到⼈家main函数⾥边去)。所以对于函数来说⾸先是⾃⼰定义的局部变量,其次是⼤家共有的全局变量。即使是递归,各⾃层的变量之间也不会相互影响。