广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++中的静态变量注意事项
  • 595
分享到

C/C++中的静态变量注意事项

2024-04-02 19:04:59 595人浏览 薄情痞子
摘要

前言 C/C++中的静态变量,相信大多数人都用过,但你很可能用错了,包括你现在所在的项目中都可能埋着这个坑,不信我们往下看! 正文 我们先来看一段大家常写的代码,很简单,这段代码没啥

前言

C/C++中的静态变量,相信大多数人都用过,但你很可能用错了,包括你现在所在的项目中都可能埋着这个坑,不信我们往下看!

正文

我们先来看一段大家常写的代码,很简单,这段代码没啥坑:

#include <stdio.h>
 
int GetData()
{
    static int a = 0;
    return a++;
}
 
int main()
{
    for (int i = 0; i < 100; ++i)
    {
        printf("%d\n", GetData());
    }
}

大家都清楚,静态变量只初始化一次,所以GetData调用了100次,打印的结果也是0-99,想必大家都很清楚 ,那请问GetData中初始化变量a的代码只会执行一次?是在哪个阶段初始静态局部变量a的?

想必大家都能回答上来,静态局部变量a的生命周期从程序运行开始就已经存在并初始化了的,并非是在GetData函数中初始化的,但又不完全对,我们看下一段代码:

#include <stdio.h>
 
int GetA()
{
    return 0;
}
 
int GetData()
{
    static int a = GetA();
    return a++;
}
 
int main()
{
    for (int i = 0; i < 100; ++i)
    {
        printf("%d\n", GetData());
    }
}

看了这段代码,不知道大家有没有懵逼?问题来了,请问GetA函数会被调用几次?静态局部变量a是在什么时候初始化的?给大家5秒钟思考!

OK!静态局部变量无论如何都只会初始化一次,这是没有毛病的,但此时静态局部变量a是在第一次调用GetData函数的时候才被初始化的,与前一个例子用常量初始化静态变量并不相同,当然生命周期还是从程序运行开始到程序结束为止。

那编译器是怎么初始化静态变量a的呢?编译器会改造GetData方法如下:

int GetData()
{
    static bool init = false;
    if (!init)
    {
        a = GetA();//a已经被定义在全局了
        init = true;
    }
    return a++;
}

这样编译器就可以保证静态变量a在GetData函数内只被初始化一次,但请问a的初始化是否线程安全

当然,不同编译器的实现并不相同,有的编译器会在初始化全局变量a的时候用上临界区等,以保证初始化的线程安全,有的却并没有,当然为了自己的代码兼容性更强,建议不要这样写,随便换个方法都能替代。或者只使用常量去初始化静态变量,这能保证线程安全!

总结,编译器在我们不知道的地方默默付出,大家要知道感恩!

到此这篇关于C/c++中的静态变量注意事项的文章就介绍到这了,更多相关C++ 静态变量内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C/C++中的静态变量注意事项

本文链接: https://www.lsjlt.com/news/165592.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C/C++中的静态变量注意事项
    前言 C/C++中的静态变量,相信大多数人都用过,但你很可能用错了,包括你现在所在的项目中都可能埋着这个坑,不信我们往下看! 正文 我们先来看一段大家常写的代码,很简单,这段代码没啥...
    99+
    2022-11-13
  • C#静态变量和非静态变量的区别
    本篇内容介绍了“C#静态变量和非静态变量的区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#基础概念之一,静态变量和非静态变量的区别?静...
    99+
    2023-06-18
  • 处理C++静态成员时的注意事项是怎样的
    本篇文章给大家分享的是有关处理C++静态成员时的注意事项是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C++静态成员的提出是为了解决数据共享的问题。实现共享有许多方法,...
    99+
    2023-06-17
  • C#静态变量的用法
    本篇内容主要讲解“C#静态变量的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#静态变量的用法”吧!C#语言还是比较常见的东西,这里我们主要介绍C#静态变量,包括介绍C#静态变量使用 st...
    99+
    2023-06-17
  • c语言声明变量要注意哪些事项
    在C语言中声明变量时需要注意以下事项:1. 声明变量前要先确定变量的类型,例如整型、浮点型、字符型等。2. 变量名必须以字母或下划线...
    99+
    2023-09-08
    c语言
  • C#中静态变量与非静态变量的区别有哪些
    这篇文章主要为大家展示了“C#中静态变量与非静态变量的区别有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中静态变量与非静态变量的区别有哪些”这篇文章吧。静态变量:静态变量使用 stat...
    99+
    2023-06-17
  • C#中怎么定义静态变量
    本篇文章给大家分享的是有关C#中怎么定义静态变量,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C#静态变量定义的实例演示:例如:新建类GlobalParams可以在类中这样写:...
    99+
    2023-06-17
  • C#中如何使用静态变量
    C#中如何使用静态变量,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#静态变量的使用实例:在类库中定义了一个静态常量,如下:public const...
    99+
    2023-06-17
  • c语言指针变量运算要注意哪些事项
    在进行C语言指针变量运算时,需要注意以下事项:1. 指针运算只能应用于指针类型,不能应用于其他类型的变量。2. 指针变量的运算只能进...
    99+
    2023-10-20
    C语言
  • C语言全局变量定义的注意事项有哪些
    在C语言中,全局变量的定义需要注意以下几个事项:1. 全局变量的定义应该在所有函数的外部,即在函数体外部进行定义。2. 全局变量的定...
    99+
    2023-09-29
    C语言
  • C#中怎么初始化静态变量
    今天就跟大家聊聊有关C#中怎么初始化静态变量,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。对于C#静态变量初始化,那么如果类中存在静态构造函数则静态字段初始值设定项的执行在该静态构造...
    99+
    2023-06-17
  • 学习C++静态成员的注意事宜有哪些呢
    这篇文章将为大家详细讲解有关学习C++静态成员的注意事宜有哪些呢,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。下面着重介绍C++静态成员,类的静态数据成员应该在代码中被显示的初始化,一定要在...
    99+
    2023-06-17
  • C++开发注意事项:避免C++多态性的潜在问题
    C++作为一种面向对象的编程语言,多态性是其的一大特点。多态性可以帮助我们在编写程序时更加灵活,有效地复用代码。但是,当我们不小心使用不当的多态性方法时,就会出现潜在的问题。本文将介绍一些C++开发注意事项,以避免多态性带来的潜在问题。避免...
    99+
    2023-11-22
    多态性 C++开发 潜在问题
  • C++的静态成员变量和静态成员函数详解
    目录一.static修饰变量二.static修饰函数三.static在类中使用1.创建与初始化 2.使用问题 3.在public、private下static变量使用 四.class...
    99+
    2022-11-12
  • C/C++开发中extern的一些使用注意事项
    目录前言数组与指针的区别具体分析extern "C"前言 前些日子,有友友问了我这样的一道问题: 数组通过外部声明为指针时,数组和指针是不能互换使用的;那么请思...
    99+
    2023-01-04
    C/C++开发extern使用事项 C C++ extern
  • c语言中静态变量的特点有哪些
    C语言中静态变量的特点有以下几点:1. 静态变量的作用域仅限于定义它的函数内部,但是其在函数调用结束后仍然存在,保留其值,下次调用时...
    99+
    2023-09-14
    c语言
  • C++中vector容器的注意事项总结
    目录容量(capacity)和大小(size)的区别容器扩容的本质emplace_back()和push_back()的区别emplace()和insert()的区别附:如果vect...
    99+
    2022-11-12
  • C++类的静态成员变量与静态成员函数详解
    目录1、类的静态成员变量2、静态成员函数总结1、类的静态成员变量 C++类的静态成员变量主要有以下特性: 1.静态成员变量需要类内定义,类外初始化 2.静态成员变量不依赖于类,静态成...
    99+
    2022-11-12
  • 使用c语言常量要注意哪些事项
    使用C语言常量时需要注意以下事项: 常量的值不能被修改。一旦常量被定义后,它的值就不能被修改。 常量的命名应该符合命名规范,...
    99+
    2023-10-23
    c语言
  • c语言静态变量的特点有哪些
    C语言中的静态变量具有以下特点:1. 生命周期长:静态变量在程序运行期间始终存在,不会随着函数的调用而销毁。它们的值在函数调用之间保...
    99+
    2023-09-14
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作