永发信息网

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

答案:1  悬赏:50  手机版
解决时间 2021-03-07 05:27
C++ 怎么让静态变量只初始化一次
最佳答案
在学习C++的时候,往往只是按照书本上的原文去强行记忆各种特性,比方说,静态变量只初始化一次。你心中一定在默念:一定要记住,static只会初始化一次云云,希望自己能够记住。告诉你,你为什么总是记不住,因为你没有正真理解静态变量的原理, 所以下面我就来告诉大家它的原理,直接上代码:
[code=C/C++]
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
int initNum = 3;
for (int i=5; i > 0; --i)
{
static int n1 = initNum;
n1++;
printf("%d\n", n1);
}

getchar();
return 0;
}
[/code]
输出结果:
4
5
6
7
8

在这里我们可以看到虽然代码循环了5次,静态变量n1确实只初始化了一次。那么为什么呢?继续上代码,相信大家就会明白些许了。
[code=C/C++]
int _tmain(int argc, _TCHAR* argv[])
{
int initNum = 3;
for (int i=5; i > 0; --i)
{
static int n1 = initNum;

//我们在这里了两句代码
int* p = &n1;
p++;
*p = 0;
//end

n1++;
printf("%d\n", n1);
}

getchar();
return 0;
}
[/code]
输出结果:
4
4
4
4
4

这次,静态变量居然跟随着5次循环也初始化了5次。你一定非常诧异,其实我们不难推断,其实静态变量就是通过静态变量后面的一个32位内存位来做记录,以标识这个静态变量是否已经初始化。而我们的p++;*p = 0;却每次都将这个值赋值为0,所以程序就一直认为n1一直没有被初始化过,并每次都初始化一次。看一下内存,就更明了了:
0x00E8716C 03 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 b0 e7 1e 6a 00 00 00
这里的内存地址就是静态变量n1的地址,值是3,后面还有一个1,你看到了吗,这个就是程序用来记录该静态变量是否初始化的标识位啦。现在你一定明白原理了,并且能轻松记住静态变量的特性了吧?
童鞋们还可以试一下,多个静态变量时,标识位的表示形式,以深入学习(透露一下,每一位标识一个静态变量的初始化状态)。
以上代码有一点需要说明:代码中之所以要用int initNum = 3;而不是直接用static int n1 = 3;是因为如果给静态变量直接赋值一个常量的话,编译器会进行优化,导致程序在一启动时,就初始化好了,不便于我们观察静态变量内存上的改变。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
苹果6plus进入app商店还是很慢 很难下载 改了
WIFI网页认证怎么破解
下列中外历史人物中,通过友好往来直接为中国
华峰建材我想知道这个在什么地方
沈阳工业安装工程股份有限公司钢结构分公司地
上海电驱动股份有限公司怎么样?
朱安平的画值钱吗
怀化到广州K9062要多少个小时
【罗定市属于哪个市】罗定市属于哪个市
怎样看一辆车的配置
温暖恋爱中的人进来,说几件你们之间最温暖,
永固标准件在什么地方啊,我要过去处理事情
丰田SAE5w-40发动机油多钱
一个质量是50kg的箱子放在水平桌面上,李科同
“让计划提前”的英文有几种写法
推荐资讯
游民星空的 全面战争:幕府将军2 “2个版本问
武汉哪有电纸书电子阅读器卖?
竹林里可以种天麻吗,如何种,请高人指点。
每到天冷了,胡同口就来了卖烤红薯的老头。老
为什么用手机登录新浪微博,账号和密码都输入
10寸和12寸轮胎,骑行感受有多大区别
vivox3v 手机换成异次元的主题换不回来了 怎
女孩说没有共同语言
美国作家马克·吐温于1900年8月12日说他是“
美容院开业,怎样发传单才能有效吸引顾客?
电子电路的信号有几种,各有什么特点?
舞阳县隆盛建筑工程公司在什么地方啊,我要过
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?