深度刨析关键字(1)
今日关键字:auto register
什么是变量
- 在内存中开辟特定大小的空间,用来保存数据
- 关键字:内存
- 如何定义变量
- 类型 变量名 = 默认值
int x = 10;
char c = 'a'; // 初始化
double d = 3.14;
c = 'd';// 赋值
宽宏大量的关键字--auto
- 局部变量
- 包含在代码块中的变量叫做局部变量
- 全局变量
- 在所有函数外定义的变量叫做全局变量
- 代码块
-
用{}括起来的区域,叫做代码块
-
int g_val = 100;// 全局
int main()
{
// 局部变量,在代码块中定义
int a = 20;
return 0;
}
变量的声明周期:
-
声明周期的概念:指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间“被释放”。
-
局部变量:进入代码块,形成局部变量【开辟空间】,退出代码块,“释放”局部变量。
-
全局变量:定义完成后,程序在运行的整个生命周期内,该变量一直有效。
-
auto 通常用来修饰局部变量,比较老的
-
如果定义局部变量 可以省略 auto
-
auto 不能修饰 全局变量
// auto int g = 100;
// 警告不能修饰 全局变量
int main()
{
for (int i = 0; i < 10; i++)
{
printf("%d \n", i);
if (1)
{
// auto 可以省略
auto int j = 1;
printf("before: %d\n", j);
j++;
printf("after:%d \n", j);
}
}
return 0;
}
最快的关键字--register
- 局部变量(全局会导致cpu寄存器被长时间占用)
- 不会被写入的(写入就需要回写内存,后续还要读取检测)
- 高频被读取的(提高效率所在)
- 如果使用,不要大量使用,因为寄存器数量有限
register int pas = 100;
printf("%d",pas);
- 被register修饰 ,是没有地址的,因为它是在寄存器中,不是在内存中。
小总结:
- auto 是修饰局部变量的,比较老的修饰,可以省略不写。
- register是修饰变量到寄存器的,快速的访问,但是在寄存器中,是没有地址的,因为在寄存器中找到了,就不在内存中了。
- 总之不能被直接取地址,无论在vs上还是gcc。