前言:
笔者写下此篇,一是为了巩固自己对c的理解,二是想抛砖引玉,不足之处,尽情提出。
在C语言程序中,变量被声明后,是有一定的有效范围的,在这个范围内,该变量是可以被使用,被访问,但是出了这块范围,就是无效的。这样的有效范围区域,被称为该变量的作用域。变量的作用域就是程序中变量可以被使用的区域。例如:在main函数里面声明定义的局部变量,如果不是作为函数参数,其他函数是无法获得其值的,无法使用、访问的,这个局部变量的作用域仅限于main函数的函数体。从侧面去想:如果在变量的作用域之外,变量无效,那么是不是可以变量重名?答案是可以的,C程序是可以在不同作用域中,对两个变量使用同一个名字。但是,在一个变量的作用域内,尽量避免出现与之重名的变量。其次,如果函数不在变量的作用域内,那么他是无法通过变量的名字来进行访问的。
变量的作用域是由其声明的位置决定的,而编译器可以确认四种不同的作用域类型——文件作用域、函数作用域、代码块作用域和原型作用域。下面的代码出现了各种可能:
(一)代码块作用域
首先介绍一下,代码块:位于一对花括号内的所有语句。凡是在代码块开头处声明的变量,表示他们允许被这个代码块里面的语句访问。如上图:6、7、9、10,它们都是具有代码块作用域。
函数的参数列表在函数体内部也算具有代码块作用域.
如果代码块出现嵌套,并且在内代码块里面出现与外代码块重名的变量,那么在内代码块里面,外面的被重名的变量会被内代码块的变量隐藏,也就是说,外面的被重名的变量在该内部代码块中是无法通过变量名字进行使用的的,如图中:6、9中出现重复的变量f ,在内部代码块中,无法使用外部 f 的值。
因为目前还没有更好的方法来解决这种情况,所以在编写代码的时候最好避免这种命名。
当代码不处于嵌套的状态时,规则另有不同:代码块A中的变量无法被代码块B中访问,因为A、B之前没有出现作用域重叠。
(二)文件作用域
任何在所有代码块之外声明的变量(全局变量)都具有文件作用域,意味着从变量声明处开始到源文件结尾处都是可以访问的。如上图中:变量a,和函数b。拓展一下:在文件中定义的函数名也具有文件作用域,因为函数名本身并不属于任何代码块。在头文件中编写并通过#include指令包含到其他文件的声明,就好像它们是直接写在那些文件中一样。它们的作用域并不局限于头文件的文件尾
(三)原型作用域
原型作用域只适用于在函数原型中声明的参数名,如图中声明 3 。在原型中,参数名可以省略,不必与函数定义中的参数名一一匹配,同样的,也无需与函数调用的实参对应。这里唯一有冲突的地方就在同一个函数原型中不止一次使用一个名字
(四)函数作用域
函数作用域只适用于语句标签,而语句标签被用于goto语句。所以,简化就是:一个函数中的所有语句标签必须唯一