全局变量和局部变量
#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所在内存中的一个随机值,这个值可能是以前的程序在这块内存运行后残留的值,局部
变量如果不初始化,会带来意想不到的结果;