1.最宽宏大量的关键字 - auto
首先在学auto关键字之前,我们得先了解局部变量、全局变量以及它们的作用域和生命周期
1.1局部变量
局部变量:包含在代码块中的变量叫做局部变量。局部变量具有临时性、局部性。进入代码块,自动形成局部变量,退出代码块自动释放。
注意:局部变量、自动变量、临时变量都是一回事,我们统称为局部变量
代码块:用一对花括号{}括起来的一条或多条语句叫做代码块,在语法上用{}括起来的语句视为一条语句称为代码块或者复合语句
正确示范:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<Windows.h> int main() { for (int i = 0; i < 5; i++) { int j = 0;//i、j都是for循环的代码块局部变量 printf("%d ", j);//打印5个0,j进入for循环的代码块自动形成局部变量,退出代码块自动释放。 } system("pause"); return 0; }
错误示范:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<Windows.h> int main() { for (int i = 0; i < 5; i++) { int j = 0; printf("%d ", j); } printf("%d ", j);//j出了for循环的代码块已经释放了,所以会报错 system("pause"); return 0; }
1.2全局变量
全局变量:在所有函数外定义的变量,叫做全局变量。全局变量具有全局性。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<Windows.h> int a = 6;//全局变量 int main() { printf("%d\n", a); system("pause"); return 0; }
注意:当进入代码块,发现局部变量与全局变量同名时优先使用局部变量(main函数也是函数,也有代码块{})
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<Windows.h> int a = 6;//全局变量 int main() { int a = 5;//局部变量 printf("%d\n", a);//打印局部变量5 system("pause"); return 0; }
1.3变量的作用域
作用域概念:指的是该变量的可以被正常访问的代码区域
局部变量:只在本代码块内有效
全局变量:整个程序运行期间,都有效
1.4变量的生命周期
生命周期概念:指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间”被释放“
局部变量生命周期: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量
全局变量生命周期: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效
1.5声明自动变量auto
默认的所有变量都是auto吗?
答案:当然不是,auto一般只修饰局部变量,所以的局部变量都是有auto修饰的,只不过省略了
记忆方法:局部变量又称自动变量,auto是声明自动变量,所以局部变量都是由auto声明的
结论:一般在代码块中定义的变量,即局部变量,默认都是auto修饰的,不过一般省略
注意:全局变量不能用auto修饰,否则报错
2.最快的关键字 - register
2.1存储金字塔
其实,CPU主要是负责进行计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到CPU内,那 么也就需要CPU具有一定的数据临时存储能力。所以现代CPU内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存。
寄存器存在的本质:在硬件层面上,提高计算机的运算效率。因为不需要从内存里读取数据啦。
2.2register 修饰变量
作用:建议尽量将所修饰变量,放入CPU寄存区中,从而达到提高效率的目的
注意:只是建议,计算机不一定会完全执行
那么什么样的变量,可以采用register呢?
局部的(全局会导致CPU寄存器被长时间占用)
不会被写入的(写入就需要写回内存,后续还要读取检测的话,register的意义在哪呢?)
高频被读取的(提高效率所在)
如果要使用,请不要大量使用,因为寄存器数量有限
注意: register修饰的变量,不能取地址(因为已经放在寄存区中了,地址是内存相关的概念)
结论:早期编译器需要人为指定register,来进行手动优化,现在不需要了。因为现在的计算机比较智能化,它会自动把一些使用频率比较高的放进寄存器(能够进行比人更好的代码优化)
3. 最爱打小报告的关键字 - extern
3.1认识多文件
多文件:将多个文件放在一个项目里叫做多文件
.h:我们称之为头文件,一般包含函数声明,变量声明,宏定义,头文件的包含等内容
.c: 我们称之为源文件,一般包含函数实现,变量定义等
3.2外部符号声明extern
问题:文件里的函数和全局变量可以跨文件使用吗?
答案:函数和全局变量可以跨文件使用,但是需要用extern进行声明。
提示:当函数不声明可以运行,但是会出现警告。当全局变量不声明,会直接保错
注意:当函数声明是前面不加extern编译器也会识别出它是声明,但全局变量声明时不加extern会被编译器理解为是在定义全局变量
#pragma once预处理指令是为了防止头文件重复包含,保证头文件只被编译一次!
先声明后使用
结论:
全局变量,是可以跨文件,被访问的。
全局函数,是可以跨文件,被访问的。
4.最名不符实的关键字 - static
4.1static修饰全局变量、函数
static修饰全局变量,该全局变量只能在本文件内被使用。
static修饰函数,该函数只能在本文件内被使用。
static修饰全局变量、函数只影响作用域,不影响生命周期
4.2static修饰局部变量
当无static修饰时:
当有static修饰时:
结论:static修饰局部变量,变量的生命周期变成全局周期。(作用域不变)
局部变量经static修饰后放在了全局\静态存储区