概述
C语言作用域有点类似于链式结构,就是下层能访问上层声明的变量,但是上层则不能访问下层声明的变量;
#include <stdio.h> #define TRUE 1 int main(void) { if (TRUE) { int x = 2; if (TRUE) { printf("%d\n", x);\\output: 2 } } }
就像上述例子,第二个if语句块是可以访问到第一个if语句块中声明的变量x的;
C语言一般把变量作用域归结为4个:
1.文件作用域;
2.语句块作用域;
3.函数原型作用域;
4.函数作用域;
当当前层声明了一个跟上层标识符和命名空间一模一样的变量时,当前层的行为是隐藏上层的声明,启用当前层的声明,而当代码返回上层,则继续沿用上层生效的声明:
#include <stdio.h> #define TRUE 1 int main(void) { if (TRUE) { int x = 2; if (TRUE) { int x = 3; printf("%d\n", x);\\output: 3 } printf("%d\n", x);\\output: 2 } }
当不带类型声明符时,当前层可以访问包括改变上层的变量:
#include <stdio.h> #define TRUE 1 int x = 1; void chx(void); int main() { chx(); if (TRUE) { printf("%d\n", x);//output: 3 } } void chx(void) { x = 3; }
对于extern外部变量,规则也是适用的:
/*file a.c*/ int x = 2;
/*file b.c*/ #include <stdio.h> #define TRUE 1 extern x; void chx(void); int main() { printf("%d\n", x);\\output: 2 chx(); if (TRUE) { printf("%d\n", x);\\output: 3 } } void chx(void) { x = 3; }
以上两个规则对于4个变量作用域都有效,整个结构类似于这样: