artfoxe6#gmail.com new

全局变量和局部变量

#include <stdio.h>

//int b;

int add ( int a  ) {
        return a + b ;
}

int b = 20 ;

int sub ( int a ) {
        return a - b ;
}

int main (void) {

        printf("add :%d\n", add( 3 ));

        printf("sub :%d\n", sub(40));

        return 0;
}

什么是全局变量 ?定义在函数外面的变量,如 上面的 b ,这个例子中有两个点需要注意:

(1) 如果把最前面的  int b 注释了,虽然b是全局的,但是编译仍然报错,在编译到 add函数的时候提示 变量 b  未定义;

我就纳闷儿了,b既然是全局变量,在add中为什么不能用呢? 同样的代码用js 来重写一下,运行正常;

现在做点改变 ,前面的int b 还是注释了的,然后我把 add函数的定义和 int b = 20 换一下先后顺序,编译正常;

int b = 20 ;

int add ( int a  ) {
        return a + b ;
}

原因处在哪里?  首选 用js 之所以可以顺利通过,是因为js的动态语言特性,在需要调用函数的时候才回去找这个全局变量存不存在,而静态编译语言在编译的时候

就会去找这个变量存在不存在, 起初,在定义add函数前  没有关于b的定义或声明,所以此时add函数体内的b是未定义的,解决办法就是,要么把b的定义放到add函数定义之前,

要么在add定义后定义b,但是要在add定义前声明有这么一个全局变量,add函数在编译的时候才知道取找b;

(2) 全局变量和局部变量定以后如果没有初始化一个值,结果是不一样的,全局变量在定义后如果没有初始化,系统会自动把值填充为0,而局部

变量不会填充,比如定义 一个局部变量c  但是没有初始化,那么c的值就是c所在内存中的一个随机值,这个值可能是以前的程序在这块内存运行后残留的值,局部

变量如果不初始化,会带来意想不到的结果;

 

posted @ 2017-03-07 15:12  codeAB  阅读(259)  评论(0编辑  收藏  举报