关键字:static extern auto
局部变量的作用域,起始于定义处,直到所在的大括号处结束。
全局变量的作用域,起始与定义处,知道本文件结束。
先看几段代码,理解了他们就理解了作用域的概念:
//===代码1=====
#include<stdio.h>
int main() {
int a = 10;
{
int a = 1; //这个a只作用于括号内
printf("a = %d\n",a);//a = 1
}
printf("a = %d\n",a);//a = 10
return 0;
}
/*整个程序的执行结果是:
a = 1
a = 10
说明括号内的变量作用不了括号外的变量*/
再看下面一段代码,与第一段代码的区别是第一个局部变量a没有给初始值:
//===代码2=====
#include<stdio.h>
int main() {
int a;
{
int a = 1; //这个a只作用于括号内
printf("a = %d\n",a);//a = 1
}
printf("a = %d\n",a);//a = ?
return 0;
}
/*整个程序的执行结果是:
a = 1
a = 不可预测 ,我的电脑跑出来a = 2686756
*/
原因是,a 是局部变量,局部变量在计算机中存储在栈中,栈的值是之前存储在里面的值,所以是随机的。
再看第三段代码,假如第一个a是全局变量,也就是声明定义在main函数以外:
//===代码3=====
#include<stdio.h>
int a = 10;
int main() {
a = 100;
{
int a = 1; //这个a只作用于括号内
printf("a = %d\n",a);//a = 1
}
printf("a = %d\n",a);//a = 100
return 0;
}
/*整个程序的执行结果是:
a = 1
a = 100
*/
值得注意的是,如果a是全局变量,默认初值为0,看第四段代码:
//===代码4=====
#include<stdio.h>
int a;
int main() {
{
int a = 1; //这个a只作用于括号内
printf("a = %d\n",a);//a = 1
}
printf("a = %d\n",a);//a = 0
return 0;
}
/*整个程序的执行结果是:
a = 1
a = 0
*/