C语言的作用域
任何一种编程语言,都会存在作用域的概念,比如C++中的private、public等,在C语言里面,主要根据变量所在的位置来区分,主要有:
局部变量
所谓的局部变量就是只能被局部访问,一般定义在函数内部或者某个块,在函数的外部是不可知且不能被访问的,比如下面的变量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <stdio.h>
int main() { int a = 1; int b = 3; int c = 5;
printf("a is %d\n", a); printf("b is %d\n", b); printf("c is %d\n", c);
return 0; }
|
其中的变量a、b、c,也就是1、3、5就是main函数的局部变量。
全局变量
全局变量按照字母意思就是在整个程序的声明周期都存在,也就是说所有的函数都可以访问到,一般而言,都会位于函数的外面,通常在程序的顶部,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <stdio.h>
int g = 7;
int main() { int a = 1; int b = 3; int c = 5;
printf("a is %d\n", a); printf("b is %d\n", b); printf("c is %d\n", c); printf("g is %d\n", g);
g = 9;
printf("g is %d\n", g);
return 0; }
|
访问顺序
那么问题就来了,万一全部变量和局部变量定义了相同给的名字,该访问使用哪一个呢,这个记住即可,如果两个名字相同,会使用局部变量,临近原则吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <stdio.h>
int g = 7;
int main() { int a = 1; int b = 3; int c = 5;
printf("a is %d\n", a); printf("b is %d\n", b); printf("c is %d\n", c); printf("g is %d\n", g);
int g = 3; printf("g is %d\n", g);
return 0; }
|
编译
编译也有所不同,方法为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ALL : scope1 scope2 scope3
scope1: scope1.c gcc -o scope1 scope1.c
scope2: scope2.c gcc -o scope2 scope2.c
scope3: scope3.c gcc -o scope3 scope3.c
.PHONY : clean
clean: rm -f scope1 scope2 scope3
|
这会产生可执行程序,当程序被执行时,它会产生下列结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| $ ./scope1 a is 1 b is 3 c is 5
$ ./scope2 a is 1 b is 3 c is 5 g is 7 g is 9
$ ./scope3 a is 1 b is 3 c is 5 g is 7 g is 3
|