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

原创 2016年08月30日 20:40:52

事实胜于雄辩,啥也别说,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] 







版权声明:本文为博主原创文章,未经博主允许不得转载。

C++中类的静态变量在哪初始化

静态数据成员的使用方法和注意事项如下:    1、静态数据成员在定义或说明时前面加关键字static。    2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:  ...

静态变量一定要先声明后赋值

标题看着让人很纳闷,什么叫做变量一定要先声明后赋值?Java中的变量不都是先声明后使用的吗?难道还能先使用后声明?能不能暂且不说,我们先来看一个例子,代码如下: public class Clien...
  • lexang1
  • lexang1
  • 2015年10月18日 23:37
  • 2410

C/C++静态变量static详解

静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。     静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。 用法1:函...

关于c++ 的静态成员变量为什么一定要初始化

我们知道C++类的静态成员变量是需要初始化的,但为什么要初始化呢。 其实这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,而不是初始化。 两者的区别在于:初...

static成员必须在类外初始化

转:http://www.cnblogs.com/graphics/archive/2010/07/16/1778743.html 为什么static成员必须在类外初始化 ...

static变量的初始值

调试windows程序设计里的例程,偶然发现局部static变量没有给初始值。google了一下,发现在csdn有类似的讨论帖,结论如下: 所有局部变量(除静态局部变量外)没有缺省值,静态局部变量缺省...

static变量初始化

1.在C++中,全局static变量和class的static成员变量在main函数之前初始化,main函数之后销毁 2. 函数内部的局部static变量在该函数第一次被调用时初始化,在main函数...

c++ 类中static变量初始化问题

首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数: [c-sharp] view plain copy  print? v...
  • myth_HG
  • myth_HG
  • 2017年01月17日 09:49
  • 2110

Spring给类中静态变量赋值

-spring-context中代码 -env.properties中代码 solr_server=http://localhost:8080/s...

C++ static、const和static const类型成员变量声明以及初始化

C++ static、const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间。 st...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:static变量的初始化和赋值的区别
举报原因:
原因补充:

(最多只允许输入30个字)