详析c#中的变量_第1页
详析c#中的变量_第2页
详析c#中的变量_第3页
详析c#中的变量_第4页
详析c#中的变量_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、5.变量5.1变量类型5.1.1静态变量5.1.2实例变量5.1.3数组元素5.1.4数值参数5.1.5引用参数5.1.6输出参数5.1.7局部变量5.2默认值5.3明确赋值5.3.1初始赋值变量5.3.2非初始赋值变量5.4变量引用变量变量代表数据的实际存储位置。每各变量所能存储的数值由它本身的类型决定。C + +语言是一种类型安全语言(type safe Ianguage , TSL ),而且C + +编译器保证每一个数值被保存在相应 的变量中。变量的数值可以通过赋值或者+或-运算符改变。在变量被赋值以前,变量自身的类型必须被明确地声明。在下面的章节中我们会提到,变量或者被初始化的或者未初

2、始化的。一个初始化的变量在被定义时被赋予了一个确定的初始值,而未初始化的变量在定义时并未被赋予确定的初始值。对于一个在程序某处被认为具有确定数值的IUA,必然在指向这一位置的所有可能的执行路径上存在赋值操作5.1 变量类型C + +共有七种变量类型:静态变量,实例变量,数组元素,数值参数,引用参数,输岀参数和局部变量。下面的部分将分别对每一种变量类型做相关描述。例子:class Apublic static int x;int y;void F(int v, int a, ref int b, out int c) int i=1;c=a+b+;x是一个静态变量,y是一个实例变量,v0是一个数

3、组元素,a是数值参数,b是引用参数,一个输岀参数,i是一个局部变量。5.1.1 静态变量使用 static 修饰符定义的变量称为静态变量。静态变量在被创建并加载后生效,当被卸载后失效。静态变量的初始值为此类型变量的默认值(参见 错误!未找到引用源。 节)。 为了方便明确赋值检查,静态变量被认为是初始化过的。5.1.2 实例变量一个没有 static 修饰符声明的域被称为实例变量。类中的实例变量当创建某类的一个实例的时候, 隶属于该类的实例变量也被生成,当不再有关于这个实 例的引用而且实例的析构函数执行了以后,此实例变量失效。类中实例变量的初始值为 这种类型变量的默认值( 5.2 )。为了方便进

4、行明确赋值检查,类中的实例变量是初始 化过的。结构体中的实例变量一个结构体中的实例变量与隶属与该结构体的结构体变量寿命相同。换句话说,结 构体中的实例变量和其中的其他变量一样被同时创建,并且同时失效。 而且该结构体中 的实例变量的初始赋值状态和其中的其余变量一致。 当一个结构体变量被是初始化过的 , 结构体的实例变量也是如此;反之如果一个结构体变量是未经初始化的时 , 结构体的实 例变量也是未经初始化的。5.1.3 数组元素当任意一个数组实例被创建时,这个数组的元素也被同时创建,当不再有任何正对 这个数组实例的引用时,它的元素也就此失效。数组中每个元素的初始值为该数字元素类型的默认值。为了方便

5、明确赋值检查,所 有的数字元素都被认为是初始化的。5.1.4 数值参数当一个不带有 ref 或 out 修饰参数被声明时,我们称它为数值参数。当被隶属的函数子句 function membe(r method, constructor, accessor, operator ) 调用时,数值参数自动生成,同时被赋以调用中的参数值。当函数成员返回后,数值参 数失效。为了方便明确赋值检查,所有的数值参数都被认为是初始化过的。5.1.5 引用参数当一个带有 ref 修饰语的参数被声明时,我们称之为引用参数。引用参数本身并不创建新的存储空间。同时,引用参数指向函数子句调用中作为参 数给出的相关变量表征

6、的存储空间。 这样,此形式参数的数值总是等于它所指向的变量。下面时关于引用参数的赋值规则。请注意它们同 在一个变量被传递给函数子句调用中相关引用参数之前,它自身必须被明确赋值,详见 5.3 。在函数子句界定的范围内,引用参数被认为是初始化过的。在结构体类型的方法实例或存取程序实例中,关键字 this 就象是此结构体类型的 引用参数,详见 5.1.6 输出参数当一个带有 out 修饰语的参数被声明时,我们称之为输出参数。输出参数本身并不创建新的存储空间。同时,输出参数指向函数子句调用中作为参 数给出的相关变量表征的存储空间。 这样,此输出参数的数值总是等于它所指向的变量。下面时关于输出参数的赋值

7、规则。请注意它们同 在一个变量被传递给函数子句调用中相关输出参数之前, 它自身不需要被明确地赋值,详见 5.3 节。在函数子句调用中,每个被传递给输出参数的变量被认为在该执行路径中已被赋值。在函数子句界定的范围内,输出参数被认为是初始化过的。在函数子句返回之前,每一个输出参数必须被明确地赋值,详见 5.3 节。在结构体类型的构造函数中,关键字 this 就象是此结构体类型的输出参数,详见 5.1.7 局部变量局部变量被局部变量声明语句创建,该语句可以在 block 块, for 循环语句或者 switch 分支语句中出现。当控制权进入 block 块 , for 循环语句或者 switch 分

8、支语句 时,其中的相关局部变量被创建。当控制权离开 block 块, for 循环语句或者 switch 分支语句时,其中的相关局部变量随即失效。局部变量不会被自动初始化,也就是说它不会有缺省值。为了方便明确赋值检查, 局部变量被认为是初始化过的。 局部变量声明语句可以包括一个变量初始化器,此时该 变量在除它的变量初始化器表达式内的完全的有效范围中被认为是明确赋值的。在一个局部变量的有效范围中, 在它被声明之前的所有关于它的引用都被是错误的。5.2 默认值下面几种类型的变量在初始化时被自动赋予相应的默认值:静态变量类实例中的实例变量数组元素变量的默认值直接取决于它自身的类型和下面几种因素:对于

9、数值型的变量, 默认值就是被此数值类型构造函数计算时使用的数值,详见 对于形式型变量,默认值为 null 。5.3 明确赋值在一个特定的函数子句可执行代码位置, 如果通过静态流分析某一个变量被编译器 证明为被自动初始化或者为至少一条赋值语句的执行对象, 那么该变量将被认为是明确 赋值的。关于明确赋值的相关规则如下所示:一个初始化过的变量(详见 对于一个在特定位置的未初始化的变量 (详见 ,如果所有可能的指向该位置的执行 路径满足以下若干条件中的任何一个,那么它也被认为是明确赋值的:a 在某一个赋值语句中该变量作为左操作数出现,详见b 任何一个调用表达式(详见 c 作为局部变量,该变量的局部变量

10、声明语句包含变量初始化器。一个结构体类型的实例变量的明确赋值状态将同时被单独和共同跟踪。 另外,除了声明 的各项规则之外,下面的各项规则适用于结构体类型变量和它们的实例变量:如果一个实例变量中包含被明确赋值的结构体类型变量,则该变量被认为是明确赋 值。如果一个结构体类型的变量中的所有实例变量都被认为是明确赋值的,那么这个结 构体变量也是明确赋值的。明确赋值是下列各项的前提:任何时刻,当一个变量 获得自身的值时,它就是明确赋值的。这样就可以杜绝不确 定的数值出现。除去下列情况,表达式中的变量都会获得相关变量数值: a 变量作为简单赋值语句的左操作数。b 变量作为一个输出参数被传递c 变量作为结构

11、体类型的变量并在成员访问中作为左操作数出现。当变量被作为形式参数被传递时,它本身必须是被明确赋值的。这样才能确保被调 用的函数子句认为该形式参数是被明确赋值的。无论函数子句在何处返回(通过返回语句 return 和程序执行到函数子句的末尾), 所有函数子句中的输出参数都必须是被明确赋值的。 这样就确保函数子句不会返回 不具备明确数值的输出参数, 也就使编译器认为函数子句把某一变量当作输出参数 等同于都给变量赋值。结构体类型的构造函数自何处返回,其中的 this 变量都必须使被明确赋值的。 下面的例程告诉我们 try 语句的不同 block 会使如何影响明确赋值的。class Astatic v

12、oid F()int i, j; try / neither i nor j definitely assignedi = 1;/ i definitely assignedj = 2;/ i and j definitely assignedcatch / neither i nor j definitely assignedi = 3;/ i definitely assignedfinally / neither i nor j definitely assignedi = 4;/ i definitely assignedj = 5;/ i and j definitely assig

13、ned / i and j definitely assigned静态流分析在检测明确赋值状态使将考虑&,| ,?:这些运算符的特殊运算。在下面例程中的每一个 method 我们将会看到class Astatic void F(int x, int y)int i; if (x = 0 & (i = y) = 0) / i definitely assignedelse / i not definitely assigned / i not definitely assignedstatic void G(int x, int y)int i; if (x = 0 | (i = y) = 0)

14、 / i not definitely assignedelse / i definitely assigned / i not definitely assigned变量 i 在 if 语句中的一个嵌套语句中是被明确赋值的,而在其余位置并不如此。在 F method中的if语句的第一个嵌套语句中,因为表达式i = y被事先执行,所以变量i在是被明确赋值的。而在这个 if 语句的第二个嵌套语句中,由于变量 i 未被赋值,所 以它被认为是未被明确赋值的。请注意,如果变量 x 的数值是负的,那么变量 i 是不会 被赋值的。同样,在 G方法中,变量i在第二个嵌套语句中是被明确赋值的而在第一个 嵌套语句中并不是这样。5.3.1 初始赋值变量下面所列各种类型的变量属于初始赋值变量:静态变量类实例中的实例变量被初始赋值的结构体类型变量中的实例变量数组元素数值参数形式参数5.3.2 非初始赋值变量下面类型的变量属于非初始赋值变量:未被初始赋值的结构体变量中的实例变量输出参数,包括结构体 c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论