全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?
thank u 问题点数:100、回复次数:21Top
1 楼topikachu(皮皮)回复于 2002-10-31 13:13:58 得分 10
不在函数里的变量就是全局变量
如果是在同一个cpp文件里,编译器自然知道什么在函数里,什么在函数外面
如果是在其他cpp文件定义的,那么你要用extern声明,告诉编译器这个变量是全局的,但是不在这个文件里.否则会遇到"未声明标识符"错误
操作系统不管你的变量.事实上,它连变量的名字都不会知道:),它只是按照编译好的代码,一步步的执行Top
2 楼ToUpdate(老六)回复于 2002-10-31 13:23:54 得分 0
UP!
Top
3 楼arcsiny(诺亚方舟)回复于 2002-10-31 14:22:35 得分 0
能用局部就不要用全局
编译起来没有效率
Top
4 楼jlqidan(jlqidan)回复于 2002-10-31 14:49:03 得分 0
还有,关于变量作用域的问题就是,在函数里有与全局变量同名的局部变量,则在此函数范围内局部变量覆盖全局变量。
使用全局变量不是个好办法,c#把一切都封装进类,已经没有全局变量的概念了Top
5 楼ywchen2000(灌水大帝:努力奋斗)回复于 2002-10-31 16:59:36 得分 0
通过{},如果在大括号外,就不是全局变量Top
6 楼cwanter(亚玛逊河上的渔夫)回复于 2002-10-31 17:03:11 得分 20
全局变量和局部变量的区别主要在于生存周期不同,全局变量在整个程序生成期间可见,局部变量在自己的作用域内可见。全局变量的内存分配是静态的,位于PE文件在数据区,在main()前由C、C++运行期函数初始化,如果没有初值,会被初始化为0。局部变量的内存分配是动态的,位于线程堆栈中。如果没有初始化的,初值视当前内存内的值而定。Top
7 楼IEQQ(从小事做起)回复于 2002-10-31 19:18:07 得分 0
小菜的论述比较全面哦。
稍稍补充,全局变量在程序运行期间长驻内存,直到程序运行结束,
局部变量 动态分配内存,
尽量少用全局变量Top
8 楼JanePeter(光光)回复于 2002-10-31 20:09:05 得分 20
1生存周期不同
2 作用范围不同
3 分配方式不同
4 安全感不同
5 用途不同!
Top
9 楼datougui(一个梦)回复于 2002-11-01 00:10:27 得分 0
局部变量,是具有块作用域的。如果把数据存储在局部变量里,函数在不同的块之间只能通过参数传递来共享数据。Top
10 楼ckacka(/*小红帽*/ckacka();)回复于 2002-11-01 00:17:47 得分 0
cwanter(小菜)说得很好!Top
11 楼x2jack(捷可)回复于 2002-11-01 00:35:31 得分 20
全局变量和局部变量的作用域不同,在函数中出现变量名同全局变量同名时以函数中的变量作为操作数,当函数返回时,函数中的变量即结束了生存期,变量值为全局变量的值。编译器是以栈结构保存信息以实现的。
int i=5;
main()
{
printf("%d\n",i);
add()
printf("%d\n",i);
}
void add()
{ int i=10;
printf("%d\n",i);
}
结果:
5
10
5
Top
12 楼GOTO_2002(mmmttt)回复于 2002-11-01 00:43:38 得分 10
全局变量和局部变量的区别方法就是他们的作用域不同。在同一作用域中如果两个变量的名字相同,遵循低作用域覆盖高作用域的原则。例如:
int a;
class c
{
private:
int a;
public:
void b();
}
c::b()
{
int a;
a=15; //这里的a就是b()中声明的a;
c::a=15; //这里的a是class c声明的a;
::a=15; //这里的a是全局变量a;
}
操作系统只管执行机器指令,把内存某个地址(存放变量a)推进区某个值,然后进行运算。Top
13 楼zhiqiu(http://www.bsdlover.cn(找兼职,谁有需求?))回复于 2002-11-01 08:08:31 得分 0
同意 cwanter(小菜)Top
14 楼rivershan(阿门)回复于 2002-11-01 08:55:40 得分 10
一个声明由四个部分组成:一个可选的描述符,一个基础类型,一个声明符,和一个可选的初始式。局部变量的作用域从它声明的那一点开始,直到这个声明所在的块结束为止。全局变量的作用域从它声明的那一点开始,一直到这个声明所在的文件的结束。一个块里声明的名字可以遮蔽在其外围的块里所声明的名字或者全局的名字。被遮蔽的全局名字可以通过作用域解析运算符::去引用。没有办法使用被遮蔽的局部名字。一个名字的作用域从它被声明的那点开始,初始式开始之前。函数参数被当作函数最外层的块中的声明。Top
15 楼shitalone(西特龙)回复于 2002-11-01 09:31:25 得分 0
同意小菜!没什么好说的了Top
16 楼ElleLang(风笛)回复于 2002-11-01 12:32:49 得分 0
那如果局部变量是静态的呢?Top
17 楼hehe214(风之子)回复于 2002-11-01 12:56:05 得分 0
xuexiTop
18 楼Bandry(菜鸟-舍我其谁)回复于 2002-11-01 13:05:02 得分 10
全局变量是在所有函数之外声明的变量,局部变量则是在函数体内声明的变量。全局变量放在内存的全程数据区,局部变量在栈上申请。全局数据区分为两部分全局数据区和静态数据区,静态数据区专门存放static变量。static的全局变量只在该文件范围内可见,不能用extern声明为外部变量。
编译器会自动初始化全局变量。Top
19 楼xdspower(杂食菜熊)回复于 2002-11-01 15:19:34 得分 0
那如果局部变量是静态的呢
局部静态变量在定义模块之外是不可见的(理论上——有特殊方法可见——传出变量的指针,这在有的编译器中要出警告或错误)
Top
20 楼ElleLang(风笛)回复于 2002-11-01 16:08:41 得分 0
局部静态变量的作用域好理解,生命周期能说得详细点吗?还有内存分配方式。Top
21 楼GOTO_2002(mmmttt)回复于 2002-11-01 16:45:01 得分 0
学习ing~~~~Top




