P14 C++局部静态变量static延长生命周期

目录

01 前言

02 变量的作用域与生命周期

 2.1 什么是作用域:

2.2 什么是变量的生命周期:

03 局部静态

3.1非静态变量例子

3.2静态变量例子

04 全局变量

05 后话 


01 前言

在前几期里,我们了解了static关键字在特定上下文中的含义。

今天我们看一看另一个环境。我们可以在局部作用域中使用 static 来声明一个变量。

这种情况和我们之前看到的两种static有点不同。这次的局部静态 Local static 有更多的含义。

02 变量的作用域与生命周期

正式开始之前我们先了解什么是作用域和生命周期

 2.1 什么是作用域:

一段程序代码中所用到的名字并不总是有效或者可用,而限定这个名字可用性的代码范围就是这个名字的作用域。

  1. 局部变量的作用域是变量所在的局部范围。
  2. 全局变量的作用域是整个工程。

2.2 什么是变量的生命周期:

变量的创建到变量的销毁之间的一个时间段。

  1. 局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。
  2. 全局变量的生命周期:整个程序的生命周期。

03 局部静态

局部 local static 变量允许我们声明一个变量,它的生命周期基本上相当于整个程序的生命周期,然而它的作用范围却被限制在这个函数内。

在任何作用域中声明它都可以,这个和函数没有关系,刚才我只是用函数举了一个例子,它并不仅仅局限在函数内部,也可以在 if 语句中,可以在任何位置。

这就是为什么函数作用域中的 static 和类作用域中的 static之间没有太大区别的原因,因为生命周期实际是相同的。唯一的区别是在类作用域中,类中的任何东西都可以访问它(这个静态变量)。

如果你在函数作用域中声明一个静态变量,它将是那个函数的局部变量。对类来说也是局部变量。

让我们来看一些例子。

3.1非静态变量例子

#include <iostream>


void funtion()
{
    int i = 0;
    i++;
    std::cout << i << std::endl;
}

int main()
{
    funtion();
    funtion();
    funtion();
    funtion();
    funtion();
    return 0;
}

 我们创建了个函数funtion,内部定义int i = 0;然后让它自加1,cout函数将结果打印出来

 

可以看到每一次调用这个函数时 i 都会被设置为 0。然后增加 1,通过调用函数来进行测试。

你可以看到1被打印了5次。

3.2静态变量例子

但是如果我给变量i 设置为static静态变量的话。

#include <iostream>


void funtion()
{
    static int i = 0;
    i++;
    std::cout << i << std::endl;
}

由运行结果分析,当static修饰局部变量i后,变量i在funtion函数中进入后创建,出函数并未后销毁,而是保留了上一次循环i出funtion函数后的值继续作用,即局部变量i被static关键字修饰后,作用域不变,生命周期变长了。 

这意味着当我第一次调用函数时,这个变量将被初始化为 0。然后所有对函数的后续调用实际上不会创建另一个全新的变量,而是将第一次初始化的变量i的生命周期延长了

04 全局变量

比如我创建一个全局变量b

#include <iostream>

int b = 0;

void funtion()
{
    //static int i = 0;
    b++;
    std::cout << b << std::endl;
}

int main()
{
    funtion();
    funtion();
    funtion();
    b = 10;
    funtion();
    funtion();
    return 0;
}

这样的写法没有任何问题。但是我们可以在任何地方访问 b。比如你可以在 function 函数调用之间让 b 等于 10。这可以极大的改变你的程序所做的事情。

所以如果你想要这样做,但又不希望让每个人都能访问这个变量。你可以在局部作用域下声明成 static。像我一开始写的程序那样。

05 后话 

最后,我们要记住

  1. 局部 local static 变量允许我们声明一个变量,它的生命周期基本上相当于整个程序的生命周期,然而它的作用范围却被限制在这个函数内。
  2. 在任何作用域中声明它都可以,这个和函数没有关系,刚才我只是用函数举了一个例子,它并不仅仅局限在函数内部,也可以在 if 语句中,可以在任何位置

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

innovus如何在floorplan view显示所有module

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 如题&#xff0c;innovus的图形界面在floorplan view下默认只能显示instance数量超过100个的module&#xff0c;如果要显示更小的module&#xff0c;需要在VIEW-Set Perference…

分享从零开始学习网络设备配置--任务4.3 使用动态路由RIPng实现网络连通

任务描述 某公司使用IPv6技术搭建企业网络&#xff0c;由于静态路由需要管理员手工配置&#xff0c;在网络拓扑发生变化时&#xff0c;也不会自动生成新的路由&#xff0c;因此采用IPv6动态路由协议RIPng实现网络连通&#xff0c;实现任意两个节点之间的通信&#xff0c;并降低…

堆的应用:堆排序

文章目录 前言堆排序的实现&#xff08;升序为例&#xff09;代码 前言 堆排序&#xff0c;顾名思义是一个利用堆来完成排序的一个操作。在之前&#xff0c;小编在[C语言学习系列–&#xff1e;【关于qsort函数的详解以及它的模拟实现】] 谈到冒泡排序&#xff0c;但是冒泡排序…

京东秒杀之秒杀详情

1 编写前端页面&#xff08;商品详情&#xff09; <!DOCTYPE html> <head><title>商品详情</title><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><script type"text/javascript" src&…

GPU集群使用Tip:查询端口号占用情况、进程由哪个用户创建、运行时指定某一张显卡

在GPU集群上运行代码&#xff0c;会面临一些问题&#xff1a; &#xff08;1&#xff09;跑着跑着GPU memory分配失败 – 因为有其他人在使用 &#xff08;2&#xff09;运行时显示端口号已被占用&#xff0c;需要你换一个端口。 这个时候一般采取的方法有&#xff1a; &#x…

java springboot测试类Transactional解决 测试过程中在数据库留下测试数据问题

好 目前 我们已经完成了表现层对应的测试了 但这里有个坑 如果我们在执行某个声明周期时 包含了测试的过程 它会在数据库中留下一条数据 但真实企业开发 绝对不允许 过一遍留一组数据的 那么 我们的期望就是 执行测试过程 但不要留下任何数据 这是我们的数据库表 然后 这里…

帆软报表 channel 反序列化漏洞复现

0x01 产品简介 FineReport、FineBI 是帆软软件开发的企业级报表设计和数据分析工具与商业智能平台。 0x02 漏洞概述 帆软FineReport、FineBI 存在反序列化漏洞&#xff0c;攻击者可向 /webroot/decision/remote/design/channel 接口发送精心构造的反序列化数据&#xff0c;在目…

E云管家微信群聊机器人开发

请求URL&#xff1a; http://域名地址/modifyGroupRemark 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是String登录实例标识chatRo…

【html+css】表单元素

目录 表单元素 展示图 简约写法&#xff1a; 完美写法 表单元素 输入框 单选框 复选框 下拉框 按钮 展示图 简约写法&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><t…

域名邮箱与企业邮箱的区别:功能、应用与优势

根据使用者的不同需求&#xff0c;电子邮件分为域名邮箱和企业邮箱两种类型。那么这两种邮箱之间究竟存在哪些区别呢&#xff1f;本文将从定义、优势和劣势三个方面进行详细解析。 什么是域名邮箱&#xff1f; 域名邮箱&#xff0c;顾名思义是以域名作为后缀的电子邮箱。域名邮…

第二十五章 解析cfg文件及读取获得网络结构

网络结构 以YOLOv3_SPP为例 cfg文件 部分&#xff0c;只是用来展示&#xff0c;全部的代码在文章最后 [net] # Testing # batch1 # subdivisions1 # Training batch64 subdivisions16 width608 height608 channels3 momentum0.9 de…

振南技术干货集:FFT 你知道?那数字相敏检波 DPSD 呢?(2)

注解目录 1 、DPSD 的基础知识 1.1 应用模型 1.2 原理推导 1.3 硬件 PSD &#xff08;相敏检波&#xff0c;就是从繁乱复杂的信号中将我们关心的信号检出来&#xff0c;同时对相位敏感。 数学原理&#xff0c;逃不掉的&#xff0c;硬着头皮看吧。&#xff09; 2 、DPSD …

数据结构(超详细讲解!!)第二十五节 线索二叉树

1.线索二叉树的定义和结构 问题的提出&#xff1a; 通过遍历二叉树可得到结点的一个线性序列&#xff0c;在线性序列中&#xff0c;很容易求得某个结点的直接前驱和后继。但是在二叉树上只能找到结点的左孩子、右孩子&#xff0c;结点的前驱和后继只有在遍历过程中才能得到…

python中的简单线性拟合

简单线性回归可以拟合线性关系的数据&#xff0c;一般使用一次函数或二次函数即可。 import numpy as np import matplotlib.pyplot as pltxnp.array([1,2,3,4,5,6,7,8,9,10]) ynp.array([2.5,4.5,4.8,5.5,6.0,7.0,7.8,8.0,9.0,10.0])#一次拟合函数 slope,interceptnp.polyfit…

TUP通信——与多个客户端同时通信

一&#xff0c;概括&#xff1a;可以通过多线程思想每加一个客户端由线程池中的主线程交给一个子线程管理 二&#xff0c;案例 &#xff08;1&#xff09;&#xff0c;线程池 &#xff08;2&#xff09;&#xff0c;服务端 &#xff08;3&#xff09;&#xff0c;客户端

从零开始学优惠券样式代码编写,让你的网站焕然一新!

样式1&#xff1a; 代码实例&#xff1a; <div class"box"><div class"itemBox"><div class"leftBox">全额抵扣</div><div class"rightBotton"><button>立即使用</button></div><…

FLV 文件格式分析

前言 flv 是 flash video 的缩写&#xff0c;是 Adobe Flash payler 支持的一种流媒体播放格式。flv 是一种层级格式&#xff0c;除了一个 flv header 外&#xff0c;剩下全是由 一个个 tag 组成。tag 是由 tag 头和 tag 数据组成。tag 类型分为音频、视频、脚本&#xff0c;一…

Kafka 如何保证消息消费的全局顺序性

哈喽大家好&#xff0c;我是咸鱼 今天我们继续来讲一讲 Kafka 当有消息被生产出来的时候&#xff0c;如果没有指定分区或者指定 key &#xff0c;那么消费会按照【轮询】的方式均匀地分配到所有可用分区中&#xff0c;但不一定按照分区顺序来分配 我们知道&#xff0c;在 Kaf…

redis笔记 -- 基础数据结构

redis笔记 基础的数据结构&#xff1a;string、list、hash、set、zset 容器型数据结构&#xff08;list、hash、set、zset&#xff09;通用规则 如果容器不存在&#xff0c;就创建一个&#xff0c;再进行操作如果容器里没有数据了&#xff0c;就立即删除&#xff0c;回收内存…

数字IC芯片验证流程及验证工具推荐?收藏专用

验证其实是一个“证伪”的过程&#xff0c;从流程到工具&#xff0c;验证工程师的终极目的都只有一个&#xff1a; 发现所有BUG&#xff0c;或者证明没有BUG&#xff0c;以保证芯片功能性能的正确性和可靠性。 验证环节对于一颗芯片的重要性也是不言而喻的&#xff1a; 从项…
最新文章