局部和全局变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);中计算后的值对mainvar2的值不会产生任何影响。

 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>




猜你喜欢

转载自blog.csdn.net/u014186096/article/details/48105073
今日推荐