版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014186096/article/details/48105073
一、实例
从解析一段程序入手,程序如下:
<span style="font-size:18px;">#include <stdio.h>
static int var1=0;
int var2=3;
int var3=6;
void f(int var2)
{
static int i=0;
int j=9;
int var1;
i++;
j--;
var1=5;
var2=6;
var3=8;
}
int main(){
int var2;
var2=5;
f(var2);
f(var1);
f(var3);
printf("var1=%d\nvar2=%d\nvar3=%d\n",var1,var2,var3);
return 0;
}</span>
<span style="font-size:18px;">答案:
var1=0
var2=5
var3=8</span>
解析:
f(var2);
这里由于在main函数中已有定义一个var2,故会采用main中定义的值,var2=5。运行f(var2);时传入的是一个实参,并没有传递main函数中的var2,所以在f(var2);中计算后的值对main中var2的值不会产生任何影响。
f(var1);
由于var1在程序开头定义的,所以var1的作用域应该是整个程序,即对f(int var)和main都有影响。由初始值var1=0;在main中并没有对var1进行任何的赋值,所以 f(var1);与 f(0);等价。同时在f()中又重新定义了一个var1,也有语句对这个重新定义的var1重新赋值即,var1=5,则var1=5仅在f函数中有效,又因为开头的var1是静态变量,所以在开头定义的var1的值仍然为0,即var1=0(在全局中)。
f(var3);
var3是最好理解的,int var3的定义语句只在开头定义全局变量的时候使用过,在主函数中并未定义var3或重新赋值,所以var3的初始值为6。由于var3是全局变量,同样的在f中也并未重新定义var3,只是对var3重新赋值,即var3=8,所以全局变量var3=8。
给几点实例提示:
A例:如果在函外部和内部都定义过同一变量名,优先采用函数内部的定义的变量。
<span style="font-size:18px;">int kk = 10;
f(int a){
a++;
}
main(){
int kk = 1;//注意,此句重新定义了kk,可以将这句的kk看做是一个新的变量,比如是aa等,与开头定义的KK是两个不同的变量,作用范围只在重新定义的函数中
kk = f(kk);
printf("%d",kk); //这里kk=2;
}</span>
B例:范围(特别注意:当两个printf要输出同一变量名时,但又不在同一函数中极有可能会出错,所以建议一般是只使用一条printf语句,其余的注释)
<span style="font-size:18px;">int kk = 10;
f(int a){
a++;
printf("%d",kk); //这里kk=10;
}
main(){
int kk = 1;//作用范围只在重新定义的函数中,出了这个范围则采用的是开头定义的全局变量KK
kk = f(kk);
//printf("%d",kk); //这里kk=2;
}</span>
C例:如果仅在函外部定义过同一变量名,则此值采用函数外部定义的变量。
<span style="font-size:18px;">int kk = 10;
f(int a){
a++;
printf("%d",kk); //<strong>这里kk=2;因其在主函数中重新赋值过</strong>
}
main(){
kk = 2;//<span style="color:#ff0000;">注意,此句只是赋值并未重新定义kk只是将第一句的kk重新赋值为kk=2,若是主函数中并没有这一句,则结果kk=11.</span>
kk = f(kk);
//printf("%d",kk); //这里kk=3
}</span>