0%

C语言 作用域

C语言的作用域

任何一种编程语言,都会存在作用域的概念,比如C++中的private、public等,在C语言里面,主要根据变量所在的位置来区分,主要有:

  • 局部变量
  • 全局变量

局部变量

所谓的局部变量就是只能被局部访问,一般定义在函数内部或者某个块,在函数的外部是不可知且不能被访问的,比如下面的变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*beginner/scope/scope1.c*/
#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
/*beginner/scope/scope2.c*/
#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
/*beginner/scope/scope3.c*/
#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
#beginner/scope/Makefile
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
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道