静态变量与普通变量的区别

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

static全局变量与普通的全局变量static全局变量只初使化一次,作用域被限制在该变量的源文件内有效,防止在其他文件单元中被引用

static局部变量和普通局部变量static局部变量只被初始化一次,下一次依据上一次结果值

static函数与普通函数static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

static的初始化顺序

先看个例子:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class B

{

public static int Y = A.X + 1;

static B() { }

static void Main(string[] args)

{

Console.WriteLine("X={0},Y={1}", A.X, B.Y);

Console.Read();

}

}

public class A

{

public static int X;

static A()

{

X = B.Y + 1;

}

}

}

有图有真相:

执行结果是X=1,Y=2

这个例子主要考查2个方面,一是static的用法,二是static的初始化顺序。了解了static的初始化顺序和规则,这个问题答答案就很容易理解了。这里涉及到以下三类static对象:static成员,static方法,static构造函数。规则如下:

一个类的static构造函数在给定的应用程序域中仅执行一次。static构造函数由在应用程序域的下列事件的首次发生时触发:

1)该类的实例被创建。

2)任何一个static成员被引用

3)如果类包含执行入口Main方法,此类的static构造函数在Main方法被调用之前执行。

4)如果类包含任何staic成员,则这些static成员在static构造函数之前进行初始化。

5)如果类包含任何static方法,则这些static方法在static构造函数之后进行初始化。

6)对于存在多个static成员,他们的初始化将按照文本顺序进行,不会因为调用顺序而改变。

现在看看上面的应用程序,Class B中有个Main执行入口,所以B首先得到初始化,顺序是static成员Y->static构造函数。在初始化Y时,引用了A.X,编译器又开始初始化Class A(注意这时Class B的初始化并没有完成),顺序也是static成员X->static构造函数。Class A中X在定义的时候没有被赋予初始值(在定义static变量时,尽量赋予初始值),编译器会默认赋予值0(int型)。然后再执行static的构造函数,由于Class B的初始化这时还没有完成,所以B.Y的值在这时被编译器赋予默认值0,所以在A的static的构造函数执行完后,X的值变为1,然后返回B继续完成初始化,得到Y的值为2。最后执行Main,输出A.X和B.Y的值。

=======================================================悲催的程序员==============================================================

1、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

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

从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。

static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

2.static有什么用途?(请至少说明两种)

1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用

=======================================================两道腾讯笔试题============================================================

参考原文:

http://www.cnblogs.com/Ihaveadream/archive/2008/06/27/1231053.html

http://www.cnblogs.com/lmjob/archive/2009/07/29/1533820.html

c#与html的区别,C# 静态变量与普通变量的区别相关推荐

  1. lacp静态和动态区别_静态lacp和动态lacp的区别

    匿名用户 1级 2016-10-24 回答 1.用户权限不同 动态lacp汇聚是一种系统自动创建/删除的汇聚,不允许用户增加或删除动态lacp汇聚中的成员端口. 只有速率和双工属性相同.连接到同一个设 ...

  2. 堆栈,静态变量和普通变量,静态函数和普通函数的区别

    首先简单介绍一下堆和栈的区别. 1.内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1).栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似 ...

  3. 静态变量与实例变量的区别

    静态变量也叫类变量,这种变量前加了static修饰符.可以直接用类名调用,也可以用对象调用,而且所有对象的同一个类变量 都是共享同一块内存空间. 实例变量也叫对象变量,这种变量没有加static修饰符 ...

  4. 全局变量、成员变量、类变量、静态变量、实例变量、局部变量的定义与区别

    全局变量 全局变量又叫成员变量,它是声明在类里,函数,静态语句块外的变量,全局变量又分为类变量(静态变量).实例变量两种. 通过代码来看一下: private int i;//实例变量 private ...

  5. 静态变量和实例变量的区别

    ①在语法定义上的区别:静态变量前要加static关键字,而实例变量(成员变量)不需要. ②在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个 ...

  6. 常见Java面试题之静态变量和实例变量的区别

    静态变量和实例变量的区别有哪些? 静态变量和实例变量可能大多数同学用的比较多,但是相关阐述并不是很常见,尤其对新手同学可以不能清楚表达. 静态变量和实例变量也是最经常遇到的一个基础java面试题,不管 ...

  7. python 中全局变量、局部变量、静态变量,实例变量的区别和理解

    python 中全局变量.局部变量.静态变量,实例变量的区别和理解 在python中一个XXX.py 文件可能有多个类所以要严格区分这些变量 全局变量: 在这个模块内也就是在整个.py 文件里,并且在 ...

  8. 静态变量(类变量)和非静态变量(成员变量、实例变量)的区别

    由static修饰的变量称为静态变量,其实质上就是一个全局变量.如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰:没有被静态修饰的内容,其实是属于对象的特殊描述. 不同的对象的实例变量将被分 ...

  9. Systemverilog 静态变量 (static) 与 动态变量(automatic) 区别

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 静态变量 Static 动态变量 Automatic 一.静态变量和动态变量的定义 二.静态变量与动态变量应用举例 总结 静 ...

最新文章

  1. CentOS7(64位)查看CPU和NVIDIA显卡温度
  2. 信息安全系统设计基础第二次实验
  3. @Deprecated使用技巧
  4. Jquery 点击当前的标签对象获取值 与JS整理
  5. oracle求部门请假类别合计_【大话IT】求oracle sql 写法,找出同类的合计,所有的总计...
  6. Android View事件机制 21问21答
  7. javascript事件代理(Event Delegation)
  8. mysql修改密码1054_Mysql修改密码异常处理(ERROR 1054)
  9. 小米网卡驱动_小米是什么?(上)
  10. 第十一届 蓝桥杯 省 模拟赛 试题+题解 C/C++描述
  11. dell N4050声卡驱动安装后仍然没有声音,改装XP完美驱动IDT声卡!实测可用!
  12. 单工,半双工,全双工区别以及TDD和FDD区别
  13. 系统集成项目管理工程师教程———活动历时估算所采用的主要方法和技术
  14. Vue解决warning Emitted value instead of an instance of Error
  15. 新员工如何快速融入新的工作环境
  16. 赴日技术签证全攻略!
  17. Android Studio计算BMI小软件
  18. cortex M7 MPU 总结
  19. 报错解决 | 重装VS2017报错140.Tools.HostX64.TargetARM.Msi.Reso
  20. 十年项目经理总结的项目质量管理十要点

热门文章

  1. 【firefox】最新浏览器无法添加组件firebug和firepath的方法
  2. 微信小程序动态切换class类名
  3. 你的SVPWM该换了之SYPWM
  4. 计算机科学之父和计算机之父_在计算机科学中找到自己的道路
  5. 公用计算机打不开扫雷,扫雷纸牌等电脑自带游戏全都打不开,点击了啥反应没有...
  6. IOS 禁用暗黑模式
  7. 每一个程序员都应该掌握一套命名的方法论
  8. 自制开源的串口数据采集卡,可作为LabVIEW数据采集卡和其他语言调用
  9. 圆内螺线与球形螺线方程和建模
  10. Java学习(java基础)-韩顺平老师