C++中的全局变量,您一定会吗?
若一个工程由两个文件组成,分别为file1,file2。在文件1中定义了全局变量n,在文件2中只要由这个变量的申明就可以使用,这个大家都知道,原因就是因为全局变量放到了程序的数据区,而数据区是属于整个程序中的所有的文件的,所以所有的文件都能“看得见”其他文件所定义的全局变量。但看看这段代码,再想一个问题。
//*******File1*******
#include <iostream.h>
int n;
void Fun1InFile1(void)
{
n=100;
cout << "n=" << n << endl;
}
//******File2*******
#include <iostream.h>
void Fun1InFile1(void);
extern int n;
void main()
{
Fun1InFile1();
cout <<"n=" << n << endl; //statement 1
}
这个结果一个是100,而另一个是0(实质上应该是随机数)。实质上这里和多文件没有关系,即便Fun1InFile1()和main()再一个文件中,也是同样的结果。
但不知道大家想过没有这样一个问题:既然全局变量n再数据区存放,那么Fun1InFile1()和main()对n操作时是对同一个内存块操作,它们的数值应该是由连续性的,即statemnet 1也应该输出100才对呀!
是否可以这样理解,函数对全局变量的操作时候,实质上是对全局变量的一个临时拷贝操作,而没有对全局数据区的那个变量的内存块操作。若真是这样,就出现一个问题!临时拷贝都是常量,没有变量,而常量是不可能再赋值的那么“n=100”就不应该编译通过!
问题点数:20、回复次数:6Top
1 楼ma100()回复于 2004-09-03 22:56:33 得分 20
/******* a.cpp ******/
#include <iostream.h>
int n;
void Fun1InFile1(void)
{
n=100;
cout <<"n=" << n << endl; //statement 1
}
void main()
{
Fun1InFile1();
cout <<"n=" << n << endl; //statement 2
}
结果:
100
100Top
2 楼ma100()回复于 2004-09-03 22:57:48 得分 0
/** a.cpp***/
#include <iostream.h>
extern int n;
extern void Fun1InFile1();
void main()
{
Fun1InFile1();
cout <<"n=" << n << endl; //statement 2
}
/*** b.cpp***/
#include <iostream.h>
int n;
void Fun1InFile1(void)
{
n=100;
cout <<"n=" << n << endl; //statement 1
}
结果 :
100
100Top
3 楼dlnet(不学无术)回复于 2004-09-03 23:20:44 得分 0
不好意思,在一个文件中确实应该是由连续性的。
那么如何理解在两个文件中的情况!Top
4 楼ma100()回复于 2004-09-03 23:25:04 得分 0
两个文件中的情况见2楼?Top
5 楼dlnet(不学无术)回复于 2004-09-04 00:02:51 得分 0
没错!
Sorry!
胡涂了!Top
6 楼dreaminger(小锡)回复于 2004-09-04 00:22:07 得分 0
我用dev-C++运行了一下代码,两个都是输出100啊,没发现有输出0的。莫非楼主眼花了?
/*file1.cpp*/
#include <iostream>
int n;
using namespace std;
void Fun1InFile1(void)
{
n=100;
cout << "file1 n=" << n << endl;
}
/*end of file1.cpp*/
/*main.cpp*/
#include <iostream>
#include <stdlib.h>
using namespace std;
void Fun1InFile1(void);
extern int n;
int main()
{
Fun1InFile1();
cout <<"n=" << n << endl; //statement 1
system("PAUSE");
return 0;
}
/*end of main.cpp*/Top




