静态变量与动态变量

0.静态存储与动态存储
1)静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。静态变量,全局动态变量都是静态存储

2)动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放

3)静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。通常把由于变量存储方式不同而产生的特性称为变量的生存期

4)静态存储只会初始化一次

 

摘自于:百度百科

 

1.区别
定义或者声明变量时,没有static修饰符的就是动态变量,有static修饰符的就是静态变量

 

2.动态变量(一下简称变量)
2.1全局变量

1)在所有函数的外部定义(包括主函数),定义之后的所有函数都能使用,属于静态存储

2)作用域为整个项目,即最终编译成可执行文件的所有文件中均可以使用动态全局变量。外部文件可以通过extern关键字来声明另一个文件中存在的全局变量

3)生命周期为从程序运行到程序退出,即贯穿整个运行时间

4)无显式初始化时默认初始化值为0

看一个有关全局变量多文件的例子:

main.cpp

#include <iostream>
using namespace std;
 
int var_a = 0;
 
void fun1();
void fun2();
 
void fun0()
{
    var_a = var_a + 1;
    cout << "fun1:" << var_a << endl;
}
 
 
int main()
{
    fun0();
    fun1();
    fun2();
    fun0();
 
    system("pause");
    return 0;
}
variable1.cpp

#include <iostream>
using namespace std;
 
extern int var_a;
 
void fun1()
{
    var_a = var_a + 1;
    cout << "fun3:" << var_a << endl;
}
variable2.cpp

#include <iostream>
using namespace std;
 
extern int var_a;
 
void fun2()
{
    var_a = var_a + 1;
    cout << "fun3:" << var_a << endl;
}
运行结果:

可以发现,全局变量var_a在所有文件中都共享,每个文件都可以访问它并修改它的值

2.2局部变量

1)在函数内部定义,属于动态存储,其他函数不能访问,外部文件也不能访问,否则会出现:

2)作用域为当前函数,从定义位置,到其所在的{}的结束位置

3)生命周期为从函数调用到函数退出

4)无显式初始化时默认初始化值为随机值

 

3.静态变量
3.1静态全局变量

1)作用域为当前文件,从定义/声明位置到文件结尾

2)生命周期为从程序运行到程序退出,即贯穿整个运行时间

3)无显式初始化时默认初始化值为0

静态全局变量与动态全局变量的主要不同:

动态全局变量可以通过extern关键字在外部文件中使用,但静态全局变量不可以在外部文件中使用。静态全局变量相当于限制了动态全局变量的作用域

看一个例子:

#include <iostream>
using namespace std;
 
static int b = 10;
 
void fun()
{
    int b = 0;
    cout << "b = " << b << endl;
    b++;
}
 
int main()
{
    for (int i = 0; i < 5; i++)
        fun();
 
    system("pause");
    return 0;
}
得到结果:

为什么得到5个0呢,为什么不是0,1,2,3,4呢

这是因为在函数fun中定义了一个动态局部变量a,而a同时又是静态全局变量,在这种情况下,作用域小的掩盖作用域大的,所以局部变量会掩盖全局变量。所以动态局部变量a掩盖了静态全局变量a

3.2静态局部变量

1)作用域为当前函数,从定义位置,到其所在的{}的结束位置

2)生命周期为从程序运行到程序退出,即贯穿整个运行时间,当下次函数调用时,静态局部变量不会被再次初始化,而是沿用上次函数退出时的值

静态局部变量与动态局部变量的主要不同:

两者作用域相同,都在函数内部,但是两者生命周期不一样,静态局部变量的生命周期是到程序的结束,而动态局部变量的生命周期是函数的结束,静态局部变量的生命周期更长,同时静态局部变量只会初始化一次,函数重复调用,但静态局部变量不会被重新初始化

看一段代码:

#include <iostream>
using namespace std;
 
void fun()
{
    int a = 0;
    static int b = 0;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    a++;
    b++;
}
 
int main()
{
    for (int i = 0; i < 5; i++)
        fun();
 
    system("pause");
    return 0;
}
执行结果:

得到这样的结果也是自然的

参考来源:

C语言动态变量与静态变量的区别

C和C++中全局变量,局部变量,静态变量和常量
————————————————

原文链接:https://blog.csdn.net/qq_33757398/article/details/81365475

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基本图形怎么改字体_PPT做得慢怎么办?掌握这6个技巧,你也能快速做出精美的PPT...

相信很多人做PPT的速度都比较慢&#xff0c;从新建一个空白PPT开始&#xff0c;再到排版设计&#xff0c;需要耗费大量的时间&#xff0c;下面就来教你这6个技巧&#xff0c;你也能快速做出精美的PPT。01.一键禁止动画最近&#xff0c;有很多小伙伴向我求助&#xff0c;问我怎样…

js eval()函数

JS eval()函数转自&#xff1a;http://www.86822.com/code/zw.asp?id614 eval()函数 JavaScript有许多小窍门来使编程更加容易。 其中之一就是eval()函数&#xff0c;这个函数可以把一个字符串当作一个JavaScript表达式一样去执行它。 举个小例子&#xff1a;…

vs 2019编写汇编并运行调试

前言 我是上学期学的汇编&#xff0c;因为有vs又不想用课上教的麻烦的dosbox以及masm32&#xff0c;但是一直没找到高亮插件和能调试的&#xff08;难在运行不了而找不到答案上&#xff0c;出现的错误在最后放出&#xff0c;还请先达们不吝指点&#xff09;汇编代码所以放弃了。…

三菱880彩铅和uni的区别_孟祥雷丨清华美院毕业,彩铅界的“冷军”(附彩铅教程哦!)...

今天要分享的是妥妥的一个高冷帅气、又有才华的艺术家&#xff0c;毕业于清华大学美术学院。有20多年的绘画经验&#xff0c;设计、绘画等艺术多面手&#xff0c;彩铅是他最出名的作品之一。人物篇(逆光)(麻花辫)用彩铅画肖像人物的人很多&#xff0c;但能把人物塑造得维妙维俏…

substring()分解字符串

substring解决了如何在指定位置将一个字符串划分为子串 单参数形式&#xff1a;返回从起始位置到结尾之间的子串**&#xff08;起始索引从0开始&#xff09;** public class SubStringReview {public static void main(String[] args) {String s "Java is great";…

ubuntu 16.04忘记登录密码的解决办法

1、开机长按shift&#xff0c;我这是按esc&#xff0c;出现如下界面&#xff0c;选中如下选项&#xff1a; 2、按回车键进入如下界面&#xff0c;然后选择有recovery mode的选项&#xff0c;注意&#xff1a;然后按e进入3的界面&#xff08;请不要使用enter键&#xff09; 推…

11g oracle xe启动_详解Oracle等待事件的分类、发现及优化

一、等待事件由来大家可能有些奇怪&#xff0c;为什么说等待事件&#xff0c;先谈到了指标体系。其实&#xff0c;正是因为指标体系的发展&#xff0c;才导致等待事件的引入。总结一下&#xff0c;Oracle的指标体系&#xff0c;大致经历了下面三个阶段&#xff1a;以命中率为主…

您可能不知道的 C++ 关键字

C 有些操作符&#xff0c;其实有对应的关键字&#xff08;目的是为了在没有这些字符的键盘也可以输入C程序) and &&and_eq &bitand &bitor |compl ~not !or ||or_eq |xor ^xor_eq ^not_eq !从可读性的角度看&#xff0c…

StringTokenizer将一个字符串分解为单词或者标记

原理&#xff1a;StringTokenizer方法实现了Iterator的设计模式&#xff0c;也直接实现了枚举接口&#xff0c;通常情况下StringTotkenizer对象根据欧洲语言的单词分割将对字符串分解为若干单词&#xff0c;例如&#xff1a; public class StringTokenizerReview {public stat…

Ubuntu14.04设置开机可以以root用户身份登录

ubuntu系统信息&#xff1a; 步骤&#xff1a; 1. 切换到root用户 2. 设置Root用户密码 3.进入到相应目录 cd /usr/share/lightdm/lightdm.conf.d/ 4.编辑 50-ubuntu.conf文件&#xff0c; 增加greeter-show-manual-logintrue 5.关机重启&#xff0c;在开机界面弹出如下图所示…

JSP数据库连接

JSP数据库连接 一、SQL Server 2000数据库的连接 驱动&#xff1a;String driverClass"com.microsoft.jdbc.sqlserver.SQLServerDriver"; 需要用到的包&#xff1a; msbase.jar , mssqlserver.jar, msutil.jar URL: String url"jdbc:microsoft:sqlserver://127…

hystrix 单独使用_Hystrix学习

学习主题&#xff1a;Hystrix解决灾难性雪崩效应-服务熔断-服务熔断处理熔断参数circuitBreaker.enabled的作用是什么&#xff1f;熔断参数circuitBreaker.requestVolumeThreshold的作用是什么&#xff1f;熔断参数circuitBreaker.sleepWindowInMiliseconds的作用是什么&#x…

Centos7搭建Ngrok

安装gcc和git&#xff08;下载ngrok源码&#xff09; yum install gcc -y yum install git -y yum install -y mercurial git bzr subversion golang golang-pkg-windows-amd64 golang-pkg-windows-386 yum update -y nss curl libcurl yum -y install gcc automake auto…

WebClient与WebRequest差异

WebRequst的使用 WebClient和HttpWebRequst是用来获取数据的2种方式&#xff0c;在我的这篇数据访问(2)中主要是讲的WebClient的使用&#xff0c;一般而言&#xff0c;WebClient更倾向于“按需下载”&#xff0c;事实上掌握它也是相对容易的&#xff0c;而HttpWebRequst则允许你…

连接字符串

方式一&#xff1a;可以使用运算符**“”**来连接字符串 public class StringBufferReview {/*** 方式一&#xff1a;使用连接* param args*/public static void main(String[] args) {String s1 "hello";String s2 "Java";String s3 s1s2;System.out.…

的使用_面部精华使用方法和使用步骤;

核心提示&#xff1a;精华液&#xff0c;是护肤品中之极品&#xff0c;成分精致、功效强大、效果显著&#xff0c;始终保持着它拥有的高贵和神秘。精华液中的基质是水&#xff0c;含有硅树脂&#xff0c;有利于渗透进皮肤和推开&#xff0c;其它添加成分&#xff0c;则带有治疗…

处理字符串中的单个字符CharAt()

1、解决方法&#xff1a;采用循环以及String类的charAt()方法 charAt()方法将返回String对象中索引值**&#xff08;从0开始&#xff09;**位置的字符。所以&#xff0c;我们只需要执行从0到String.length()-1的循环&#xff0c;就能够依次处理字符串中的所有字符。 注意&#…

Acer Travelmate T3290笔记本拆机指南

中午闲来无事&#xff0c;把永哥的笔记本拆了&#xff08;Acer Travelmate某款&#xff0c;很老的机器了&#xff09;。整个过程有惊无险&#xff0c;也没拍照片&#xff0c;大体说下拆机流程吧&#xff0c;如果有人要拆该系笔记本可以参考。 先卸电池。拿掉诸如读卡器盖&#…

解决VS2013中出现类似于error C4996: 'scanf': This function or variable may be unsafe的安全检查错误

禁用安全检查&#xff0c;一步到位&#xff01; 参考URL&#xff1a;https://blog.csdn.net/dan15188387481/article/details/49622783

横向全屏滑动插件_【案例】JQuery横向手风琴图片轮播切换代码

点击上方[我分享我快乐]→[...]右上角→[设为星标⭐]即可第一时间获取最新设计资源哈喽大家好&#xff0c;又到了每周二经典案例环节啦~同学们还想了解哪些网页知识今天段老师给同学们带来的是JQuery横向手风琴图片轮播切换代码。01脚本简介jQuery实现水平手风琴图片轮播切换特…