c语言深度刨析关键字(1)

142 阅读2分钟

深度刨析关键字(1)

今日关键字:auto register

什么是变量

  • 内存中开辟特定大小的空间,用来保存数据
  • 关键字:内存
  1. 如何定义变量
  2. 类型 变量名 = 默认值
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

  1. 局部变量(全局会导致cpu寄存器被长时间占用)
  2. 不会被写入的(写入就需要回写内存,后续还要读取检测)
  3. 高频被读取的(提高效率所在)
  4. 如果使用,不要大量使用,因为寄存器数量有限
register int pas = 100;
printf("%d",pas);
  • 被register修饰 ,是没有地址的,因为它是在寄存器中,不是在内存中。

小总结:

  • auto 是修饰局部变量的,比较老的修饰,可以省略不写。
  • register是修饰变量到寄存器的,快速的访问,但是在寄存器中,是没有地址的,因为在寄存器中找到了,就不在内存中了。
  • 总之不能被直接取地址,无论在vs上还是gcc。