龙空技术网

C变量的作用域

林辰爱学习 209

前言:

今天看官们对“c语言的图形变量的作用”大约比较讲究,你们都想要知道一些“c语言的图形变量的作用”的相关文章。那么小编在网摘上网罗了一些对于“c语言的图形变量的作用””的相关知识,希望兄弟们能喜欢,兄弟们快快来学习一下吧!

C变量分为两类:自动变量和外部变量。一个变量是自动的还是外部的,取决于它是在程序的哪一部位说明的。

书里说,在函数内声明的变量(包括函数的参数),称为自动变量。确切说法是:自动变量是在某代码块(函数体也是一个代码块)中声明的变量。当执行到其所在的代码块时,该自动变量出现,执行完后消失。故称之为auto。由此可见,自动变量的作用域仅限于其所在的代码块。其存在时间就是该代码块的执行时间。自动变量的时域是临时的,空域是局部的。auto这个C保留字好象从未使用过,因为在代码块内声明的就是auto变量。

你可以在函数体的开头声明自动变量。这样,这些自动变量便为该函数所私有。如果你希望某几个变量的作用域仅限于函数内某一段代码,你可以将这一段代码用花括弧括起,构成一个代码块,然后,在这个代码块的开头声明这些变量。因而,C允许你使一个变量的作用域局部到一条语句。对变量的作用域作精细的控制,是C语言的一个非常重要的优点,也是其作为结构化程序设计语言的重要特征之一。

注意:在C中,代码块的前部是所有的声明语句,后部是所有的执行语句。这就是说,在一个代码块中,声明语句不能放在执行语句的后面。C++去掉了这一限制。声明语句可以出现在代码块的任意位置。这样,自动变量的作用域就不一定是整个代码块,而是从说明处起直至该代码块末尾。

自动变量存放在堆栈中。当所在代码块执行完毕后即弹出而消失。因而,自动变量的初始值是未知值。且当该代码块被再次调用时,自动变量的初始值仍然是未知值而不是上次调用结束时的值。因此,你在编程时要注意,不要认为自动变量的初始值是0或空白。

在所有函数之外定义的变量是外部变量。这“外部”一词的意义就是在函数外。你可以在程序的任一部位定义,只要是在任一函数之外,就是外部变量,为整个源文件所识别。建议你在程序的头部定义所有的外部变量。外部变量的作用域是其所在的源程序文件,在程序执行期间均有效。因此,外部变量仍然是局部的,只不过它们的作用域比自动变量大而已。很多C书把变量分为全局变量和局部变量,是错误的。C标准从来没有定义过“全局变量”。

外部变量的初始值为零,字符型是空字符。

几乎所有的C编译器支持多文件编译。即允许将整个程序分开写在几个源文件中。好象只有一个限制:不能把一个函数拆开写在几个源文件里。

设某源程序由若干个源文件组成。全局变量可以在某源文件中定义,然后在其它需访问这个外部变量的源文件里用保留字extern对它进行声明。示例:

	文件甲														文件乙	int	x, y;													extern int	x, y;	......															 ......	main(void){									func1(void){		......																......  }																		}

在文件甲中定义了两个外部变量x和y,在文件乙中用extern加以声明。这样,在这两个文件中,均可以访问x和y。这样一来,这两个外部变量的作用域就扩大到甲、乙两个源文件了。不要在所有的源文件中都加以声明,而是仅仅在需要访问该外部变量的源文件中加以extern声明。目的是使变量的作用域仅可能小。这是结构化程序设计思想之重点。

这里很小心地使用“定义Definition”和“声明Declaration”两个术语。定义引起存储分配。你在某个文件中定义了一个外部变量,它就在内存的某一处占了一个位置(至于占多少个字节则由变量类型决定)。在另一文件中的extern语句仅在这个文件中声明了这个已存在的变量,以便在这个文件中也能访问该变量。不要在多个文件中定义同一变量,但可以在多个文件中说明这个变量。换句话说,一处定义,多处声明。

前面描述自动变量时,使用的是“声明”而非“定义”。因为,在C中,自动变量(不单单是函数参数)均存放在堆栈中,不占固定的内存位置。确切地说,当应用被操作系统装入内存时,装载器没有为它们分配空间。

C语言的一个特点是对变量的考虑特别周详。其中一点是增加了存储类这一其它高级语言所没有的变量属性。

如果在说明自动变量时,前缀一个保留字static,则该变量称之为“静态自动变量”。其作用空间与常规自动变量相同,但其时间域则是永久的,即当其所在的代码块执行完毕后变量仍然存在。该代码块被再次执行时,此变量的初始值便是上次调用终止时的变量值。静态自动变量可以赋予初值。由上述可知,这个赋初值仅在第一次调用时实施。调用结束时,终止值被保留,在下一次调用时作为初值。如果不显式赋初值,则在编译时,数值型被初始化为0,字符型初始化为空字符。由此可见,静态自动变量占据确定的内存空间,前面的“说明”一词应改为“定义”。在某些场合,需要这样的变量。举一个最简单的例子:它可以用来统计所在模块被执行了多少次。

在定义外部变量时,也可前缀static。此类变量称为“静态外部变量”,其作用域仅限于所在的源文件。显然,这有助于多人共同开发。各人可以有各人的“个人全局变量”。

各种变量的时空特性归纳如下:

由上述可见,从变量角度看,C无愧是一个天生的结构化程序设计语言。只要运用得当,你可以得到代码块级(可小至一条语句)变量、函数级(可以是函数的一个局部)变量、源文件级(可以是源文件的一个局部)变量、源文件组级(可以仅局限于几个源文件)变量、全局变量。

使每一个变量的作用域尽可能小,是结构化程序设计最重要的原则(我认为)。这既有利于程序的维护,也有利于多人共同开发。

标签: #c语言的图形变量的作用