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、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:  ...
  • zhangpinghao
  • zhangpinghao
  • 2012年11月29日 01:01
  • 3232

Java中静态(static)成员何时才会初始化

先谈static static方法就是没有this的方法。在static方法的内部不能调用非静态方法,反过来倒是可以的,而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这...
  • qJay_Dev
  • qJay_Dev
  • 2016年04月24日 01:00
  • 8158

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

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

Java静态方法,静态变量,初始化顺序

1. 静态方法:         成员变量分为实例变量和静态变量。其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量。而静态变量被该类所有的对象公有(相当于全...
  • leeyu35
  • leeyu35
  • 2012年07月17日 14:38
  • 37791

静态变量初始化

我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块(顺序按声明顺序))>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这...
  • hqdoremi
  • hqdoremi
  • 2014年02月27日 11:17
  • 1528

C++ 怎么让静态变量只初始化一次

童鞋们在学习C++的时候,往往只是按照书本上的原文去强行记忆各种特性,比方说,静态变量只初始化一次。你心中一定在默念:一定要记住,static只会初始化一次云云,希望自己能够记住。告诉你,你为什么总是...
  • xiaowall
  • xiaowall
  • 2012年07月19日 14:46
  • 5583

c++中静态成员变量要在类外部再定义或初始化的原因

,否则产生link2001错误. class testClass {   public:   static int m_i; }; // 类外部定义,若不写会产生 // error LNK2001...
  • icandoit2010
  • icandoit2010
  • 2016年12月09日 17:20
  • 4364

C语言静态变量的初始化

通过一个例子说明C语言如何初始化静态变量。 给出C语言代码 typedef int (* Fun)(void * obj, int argc, int *argv); struct Function...
  • HiHui
  • HiHui
  • 2017年04月30日 08:50
  • 775

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

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

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

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

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