#include <stdio.h>
int x = 20;
void print_x(void){
puts("------print_x函数调用文件作用域------");
printf("x = %d\n", x);
}
int main(void){
int i;
int x = 88;
print_x();
puts("-------main函数调用块作用域-----------");
printf("x = %d\n", x);
puts("---for循环体打印for循环体内部块作用域---");
for (i = 0; i < 5; i++){
int x = i * 100;
printf("x = %d\n", x);
}
puts("---------main函数调用块作用域-----------");
printf("x = %d\n", x);
}
运行结果:
由于print_x函数内没有定义变量,所以会引入 函数体外定义的变量 x = 20;
当在main函数内部打印x变量时,会在内部寻找是否定义了x 变量 如果有,则会就近原则打印main 内部定义的变量,如果没有 则会打印 main 函数体外面的变量。
for循环会打印循环体中的变量,当for语句的循环结束之后,该变量 x 的名称就会失效。
所以在调用最后一个printf函数时,x值显示的是mian函数内定义 x = 88;
#include <stdio.h>
int x = 20;
int main(void){
puts("-------调用函数外层的变量-----------");
printf("x = %d\n", x);
int x = 88;
puts("---------调用函数内层的变量------------");
printf("x = %d\n", x);
}
运行结果:
总结:
-
如果 两个同名变量分别拥有文件作用域和块作用域,那么只有拥有块作用域的变量是 “可见” 的,而拥有文件作用域的变量会被 “隐藏” 起来。
-
当同名变量都被赋予了块作用域的时候,内层的变量是“可见”的,而外层的变量会被 “隐藏” 起来。
-
函数会就近原则,先找函数体内是否存在定义的变量,如果没有,则会寻找函数体外层的变量,如果都没有,程序会报错。
-
程序是从上往下逐条执行的
如果在引用变量的下方定义了变量,没有在上方定义变量,则不会调用函数体下方的变量。