static变量的初始化和赋值的区别

事实胜于雄辩,啥也别说,code说明问题:

int add(int a, int b)
{
	static int result = a + b;
	return result;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a = add(2, 1);
	int b = add(3, 4);
	if ( a== b)
		cout << 1 << endl;
	return 0;
}
输出为:1。

稍作修改:

int add(int a, int b)
{
	static int result = 0;
        result = a + b;
	return result;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a = add(2, 1);
	int b = add(3, 4);
	if ( a== b)
		cout << 1 << endl;
	return 0;
}
没有任何输出。

这就是static变量的一个性质:初始化只有一次,但是可以多次赋值。在第一段代码中:

static int result = a + b;
从汇编的调试过程中可以发现只有第一次调用add方法时才进行了初始化,第二次初始化直接跳过了。但是赋值是可以多次的。这也就说明了静态变量的初始化和赋值的区别。

另外,如果上述代码返回引用,并且同时比较二者不使用中间变量呢?如下例:

int& add(int a, int b)
{
	static int result = 0;
	result = a + b;
	return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
	//int a = add(2, 1);
	//int b = add(3, 4);
	if (add(2, 1) == add(3, 4))
		cout << 1 << endl;
	return 0;
}
输出结果为:1

00313C7E  push        1  
00313C80  push        2  
00313C82  call        add (0311451h)  
00313C87  add         esp,8  
00313C8A  mov         esi,eax  
00313C8C  push        4  
00313C8E  push        3  
00313C90  call        add (0311451h)  
00313C95  add         esp,8  
00313C98  mov         ecx,dword ptr [esi]  
00313C9A  cmp         ecx,dword ptr [eax]  
00313C9C  jne         wmain+6Bh (0313CCBh)
从下面比较的汇编看来,其实二者比较的是同一地址的数据,所以必然相等。
<pre name="code" class="plain">00313C9A  cmp         ecx,dword ptr [eax] 







阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/petersmart123/article/details/52372754
文章标签: static 静态变量 c++
个人分类: effective c++
相关热词: static变量
上一篇编译过程和符号表重定位问题、静态和动态链接
下一篇C++声明、定义、类的定义、头文件作用、头文件重复引用
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭