`
chriszeng87
  • 浏览: 741354 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

静态变量

    博客分类:
  • Java
阅读更多
静态变量

   静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 对于自动变量,前面已经介绍它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。
由此看来, 一个变量可由static进行再说明,并改变其原有的存储方式。

   1. 静态局部变量

   在局部变量的说明前再加上static说明符就构成静态局部变量。

   例如:

static int a,b;
static float array[5]={1,2,3,4,5};


   静态局部变量属于静态存储方式,它具有以下特点:

   (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

   (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

   (3)允许对构造类静态局部量赋初值。在数组一章中,介绍数组初始化时已作过说明。若未赋以初值,则由系统自动赋以0值。

   (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

   [例5.15]

main()
{
int i;
void f(); /*函数说明*/
for(i=1;i<=5;i++)
f(); /*函数调用*/
}
void f() /*函数定义*/
{
auto int j=0;
++j;
printf("%d\n",j);
}

   程序中定义了函数f,其中的变量j 说明为自动变量并赋予初始值为0。当main中多次调用f时,j均赋初值为0,故每次输出值均为1。现在把j改为静态局部变量,程序如下:

main()
{
int i;
void f();
for (i=1;i<=5;i++)
f();
}
void f()
{
static int j=0;
++j;
printf("%d\n",j);
}
void f()
{
static int j=0;
++j;
printf("%d/n",j);
}

   由于j为静态变量,能在每次调用后保留其值并在下一次调用时继续使用,所以输出值成为累加的结果。读者可自行分析其执行过程。

   2.静态全局变量

   全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

   四、寄存器变量

   上述各类变量都存放在存储器内, 因此当对一个变量频繁读写时,必须要反复访问内存储器,从而花费大量的存取时间。 为此,C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写, 这样可提高效率。寄存器变量的说明符是register。 对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。

   [例5.16]

求∑200i=1imain()

{
register i,s=0;
for(i=1;i<=200;i++)
s=s+i;
printf("s=%d\n",s);
}

   本程序循环200次,i和s都将频繁使用,因此可定义为寄存器变量。对寄存器变量还要说明以下几点:

   1. 只有局部自动变量和形式参数才可以定义为寄存器变量。因为寄存器变量属于动态存储方式。凡需要采用静态存储方式的量不能定义为寄存器变量。

   2. 在Turbo C,MS C等微机上使用的C语言中, 实际上是把寄存器变量当成自动变量处理的。因此速度并不能提高。 而在程序中允许使用寄存器变量只是为了与标准C保持一致。3. 即使能真正使用寄存器变量的机器,由于CPU 中寄存器的个数是有限的,因此使用寄存器变量的个数也是有限的。
分享到:
评论

相关推荐

    WPF绑定静态变量的示例代码

    在本文中,我们将深入探讨如何在Windows Presentation Foundation (WPF)中绑定控件到静态变量。WPF是一种用于构建桌面应用程序的强大框架,它允许开发者通过数据绑定机制将UI元素与后台数据模型紧密关联,实现视图与...

    C# 公有变量 私有变量 静态变量

    本文将深入探讨C#中的公有变量(public)、私有变量(private)和静态变量(static),并结合20171028的C#编程实践进行说明。 **公有变量(public)** 公有变量是可以被程序任何部分访问的成员,无论是在同一类中...

    VB 静态变量举例

    在VB(Visual Basic)编程语言中,静态变量是一种特殊的变量类型,它的值在程序执行期间不会被清除,即使函数或过程结束,静态变量仍然保留其值。这种特性使得静态变量在需要跟踪或累计数据时非常有用。下面我们将...

    WPF绑定静态变量的示例代码(二)加上IValueConverter

    在本文中,我们将深入探讨如何在Windows Presentation Foundation (WPF) 中绑定静态变量,并通过使用IValueConverter接口来实现动态更新控件的显示。WPF是.NET Framework的一部分,它为构建丰富的桌面应用程序提供了...

    利用静态变量对函数访问次数计数.zip

    在这种情况下,我们可以使用静态变量来实现这个目的。本文将深入探讨如何利用静态变量对函数访问次数进行计数,以及这种方法背后的原理和注意事项。 首先,我们需要理解静态变量的概念。在C++或类似的编程语言中,...

    springboot 使用yml配置文件给静态变量赋值教程

    由于我们有一个静态工具类`ClickHouseUtil`,其中的方法依赖于静态变量,所以我们不能直接使用`@Value`注解为静态变量赋值。Spring框架不允许在静态字段上直接注入值,因为它不支持实例化静态对象。 为了解决这个...

    static静态变量使用@Value注入方式.md

    ### static静态变量使用@Value注入方式 #### 一、引言 在Java开发中,特别是基于Spring框架的应用程序中,开发者经常会遇到需要为类中的成员变量注入外部配置值的情况。Spring框架提供了多种注入机制,其中`@Value...

    易语言静态变量初始化

    在易语言中,静态变量在程序开始运行时被初始化,之后每次调用含有该静态变量的函数或过程时,它不会重新初始化,而是保持上一次调用结束时的值。这种特性使得静态变量常用于计数器或者存储跨函数调用的状态信息。 ...

    C#中静态变量的使用

    C#中静态变量的使用 C# 中静态变量的使用是指在 C# 语言中使用静态变量的方法和技术。本文将详细介绍静态变量与非静态变量的区别、静态变量的使用方式、静态构造函数的使用等方面的知识点。 一、静态变量与非静态...

    静态变量的导入以及集合的运用

    ### 静态变量的导入以及集合的运用 在Java编程语言中,静态变量和集合是两个非常重要的概念。本文将详细介绍如何导入静态变量,并深入探讨集合类的使用方法及其实例。 #### 一、静态变量的导入 静态变量(也称为...

    单链表 数据结构 静态变量、静态方法的使用

    用c++的类实现,对于c++初学者帮助较大,主要熟悉静态变量 静态方法的使用 将练习与数据结构相结合

    python类和函数中使用静态变量的方法

    在Python编程语言中,类和函数的静态变量通常是指那些在多次调用中保持其值不变的变量。静态变量在其他面向对象的语言如Java或C#中比较常见,但在Python中,由于其动态特性的存在,实现静态变量的方式稍有不同。本篇...

    Static静态变量的应用(VB6.0代码编写)

    总的来说,Static静态变量是VB6.0编程中一个强大的工具,合理利用可以解决许多实际问题,但同时也需要谨慎处理,以确保代码的健壮性和效率。在实际编程中,我们需要根据具体需求权衡是否使用Static变量,以及如何...

    静态变量和非静态变量的区别.xmind

    静态变量和非静态变量的区别

    VB求N的阶乘和静态变量的演示

    这个程序演示了如何在VB环境中实现这一功能,并结合静态变量的概念来优化代码。 首先,我们需要理解静态变量。在VB中,静态变量是一种在函数或过程中保存其值的变量,即使在函数或过程调用结束之后,它的值也不会...

    全局变量、局部变量、静态变量即内存管理

    3. 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。 4. 文字常量...

    static 静态变量加载

    statilocal java 静态变量和静态块加载顺序,静态变量和同名静态变量块加载的顺序。

    VB.NET局部静态变量介绍

    经过长时间学习VB.NET局部静态变量,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西。VB.NET能够实现很多C#不能做到的功能,如When语句、Optional参数、局部Static变量、对象实例访问静态...

    ios-block的局部变量和全局变量和static的静态变量联系.zip

    在iOS开发中,Block、局部变量、全局变量和静态变量(`static`)是编程中常见的概念,它们各自有自己的特点和用途,同时在特定情况下,它们之间也存在一定的联系。让我们详细探讨一下这些知识点。 首先,Block是...

    PHP中的静态变量及static静态变量使用详解

    静态变量的主要特征是在函数调用结束后,其值不会消失,可以在下一次函数调用时继续使用。要创建一个静态变量,只需在变量声明前加上关键字static。 PHP中的静态变量有以下特点和用途: 1. 静态变量的生命周期 ...

Global site tag (gtag.js) - Google Analytics