静态变量为什么能做到只初始化一次?

时间:2022-01-28 21:20:06
#include <iostream.h>
#include <string.h>
#include <stdlib.h> 

void main() 
{

  for (int i =1;i<5; ++i)
  {
   static int a = i;
  cout << a <<endl;
  }
   
}


这段代码,输出的A的值都是1,编译器是如何做到,静态变量只初始化一次的?请教各位指点

20 个解决方案

#1


我想应该是放到了静态区的原因

#2


所有的对象(不仅仅是静态对象)初始化都只有一次

因为a初始化为1之后,一直都没有销毁(因为是static),所以不会再次初始化

#3


static 只能声明一次,赋值可以多次,
你在循环外声明,然后赋值就可以得到1 2 3 4 了

#4


……
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

int main(void)
{
for (int i =1;i <5; ++i)
  {
    static int a;
    a = i;
    cout << a <<endl;
  } 
  
return 0;
}

#5


帮顶一下

#6


对。。。初始化只有一次。。如果你赋值就可以改变了。

#7


静态区的变量的生存期为整个源程序。所以他只需初始化一次,而自动变量存放在栈区,一旦调用过程结束就会被销毁。

#8


4楼分析很清楚。
你得赋值

#9


请问什么可以初始化两次?

#10


3楼说的浅显易懂!

#11


因为静态变量只能声明一次,但看赋值多次

#12


你把静态变量当成只能在声明它的函数中访问的全局变量就好了。

#13


3楼正解

#14


对编译器来说,不存在什么静态不静态,只有一个heap而已(global/static/etc.).和汇编参考就很容易理解了。

而非静态的,都是在stack中分配。

引用楼主 seekunknown 的回复:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>

void main()
{

  for (int i =1;i <5; ++i)
  {
  static int a = i;
  cout < < a < <endl;
  }
 
}


这段代码,输出的A的值都是1,编译器是如何做到,静态变量只初始化一次的?请教各位指点

#15


引用 2 楼 cphj 的回复:
所有的对象(不仅仅是静态对象)初始化都只有一次

 因为a初始化为1之后,一直都没有销毁(因为是static),所以不会再次初始化
顶一下

#16


久违了csdn

#17


引用 9 楼 yshuise 的回复:
请问什么可以初始化两次?

你明白什么叫做初始化吗?

#18



这帖真好!强化了概念。

#19


引用 17 楼 aozhi 的回复:
引用 9 楼 yshuise 的回复:
 请问什么可以初始化两次?

 你明白什么叫做初始化吗?

那句话是反问……

#20


嗯,三楼说的很清楚明白,多谢

#1


我想应该是放到了静态区的原因

#2


所有的对象(不仅仅是静态对象)初始化都只有一次

因为a初始化为1之后,一直都没有销毁(因为是static),所以不会再次初始化

#3


static 只能声明一次,赋值可以多次,
你在循环外声明,然后赋值就可以得到1 2 3 4 了

#4


……
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

int main(void)
{
for (int i =1;i <5; ++i)
  {
    static int a;
    a = i;
    cout << a <<endl;
  } 
  
return 0;
}

#5


帮顶一下

#6


对。。。初始化只有一次。。如果你赋值就可以改变了。

#7


静态区的变量的生存期为整个源程序。所以他只需初始化一次,而自动变量存放在栈区,一旦调用过程结束就会被销毁。

#8


4楼分析很清楚。
你得赋值

#9


请问什么可以初始化两次?

#10


3楼说的浅显易懂!

#11


因为静态变量只能声明一次,但看赋值多次

#12


你把静态变量当成只能在声明它的函数中访问的全局变量就好了。

#13


3楼正解

#14


对编译器来说,不存在什么静态不静态,只有一个heap而已(global/static/etc.).和汇编参考就很容易理解了。

而非静态的,都是在stack中分配。

引用楼主 seekunknown 的回复:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>

void main()
{

  for (int i =1;i <5; ++i)
  {
  static int a = i;
  cout < < a < <endl;
  }
 
}


这段代码,输出的A的值都是1,编译器是如何做到,静态变量只初始化一次的?请教各位指点

#15


引用 2 楼 cphj 的回复:
所有的对象(不仅仅是静态对象)初始化都只有一次

 因为a初始化为1之后,一直都没有销毁(因为是static),所以不会再次初始化
顶一下

#16


久违了csdn

#17


引用 9 楼 yshuise 的回复:
请问什么可以初始化两次?

你明白什么叫做初始化吗?

#18



这帖真好!强化了概念。

#19


引用 17 楼 aozhi 的回复:
引用 9 楼 yshuise 的回复:
 请问什么可以初始化两次?

 你明白什么叫做初始化吗?

那句话是反问……

#20


嗯,三楼说的很清楚明白,多谢

#21