声明
说明符+表达式列表
int a;
char j, k l;
定义
一般的情况下,我们把建立空间的声明称之为定义,而把不需要建立存储空间的声明称之为声明。
int tern = 1; //定义
int main() {
int a; //也是定义,因为建立了存储空间
extern int tern; // 声明定义在别处的变量,仅仅是声明,没有建立空间
}
tern被声明了两次,
第一次声明为变量预留了存储空间构成了定义。称为定义式声明。
第二次声明只是使用之前的变量,而没有创建空间所以仅仅是声明。
extern关键字只能做声明,不能定义。
初始化
变量的初始化: 为变量声明或者定义之后,赋上初值的过程,就是变量的初始化。
定义和初始化的区别
int a; //只是定义也是声明,但是并没有给初始值,所以不是初始化。
int a = 4; //既是定义又是初始化。
extern int a; //仅仅是声明。
当然定义和初始化也可以分开
int b; //声明/定义 变量
b = 2; //初始化变量
静态变量初始化
静态变量默认将值初始化为0。
可执行程序载入到内存时,已经保存了正确值的位置,会将值赋值给变量。
完成这个任务不需要额外的时间与指令,静态变量就会初始化完成。
自动变量初始化
自动变量不会被初始化为0.
程序在链接时还无法判断自动变量的存储位置,因为局部变量可能在函数中每次调用时占据不同位置。所以自动变量会使用更多开销。
- 自动变量的初始化和声明然后赋值,效率一样,无差别。
- 静态变量每次只在程序执行时初始化一次,而自动变量在每次执行到所在函数时都会进行一次初始化。
- 因为自动变量初始化在运行时才执行,你可以用变量给他初始化, 而静态变量不能使用变量来初始化 。
int a = 4; int b = a + 3; //static int c = a + 4; 编译报错
- 建议对自动变量初始化,或者保证使用前赋值,不然他会有一个垃圾值是非预期的。