全局变量和局部变量

本文探讨了C语言中全局变量的定义与使用,特别是在不同函数和编译阶段的行为差异,并对比了JavaScript等动态语言的特点。
#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所在内存中的一个随机值,这个值可能是以前的程序在这块内存运行后残留的值,局部

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

 

转载于:https://www.cnblogs.com/codeAB/p/6514886.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值