C语言之关键字(1)

本文详细解释了变量的定义、声明原理,以及为何需要变量。介绍了局部变量和全局变量的区别,以及register关键字对提升效率的影响。强调现代编译器的优化已足够,register通常无需手动使用。
摘要由CSDN通过智能技术生成

定义与声明

什么是变量(是什么)

在内存中开辟特定大小的空间,用于保存数据
本质是在内存的某个位置开辟空间

如何定义变量(怎么用)

类型 变量名 = 默认值(初始值)

int x =10;
char c = 'c';
double d = 3.14;
//三个都属于初始化

c ='b';//赋值(此时空间已经存在在内存中)

为什么要定义变量(为什么)

计算机是为了进行计算的,计算是需要数据的,但是计算中任何一时刻,不是所有的数据都要马上被计算的。换句话说,我们需要数据被暂时保存起来,等待后续处理

变量定义的本质

根据前面的知识,我们知道:
1.程序运行,需要加载到内存中;2.程序计算,需要使用变量

那么,定义变量的本质:在内存中开辟一块空间,用来保存数据 (为什么一定是在内存中:因为定义变量,也是程序运行逻辑的一部分,程序已经被加载到内存中)

变量声明的本质

告知给大家,简单来说就是广而告之

总结

  1. 定义:开辟空间的,只能有一次
  2. 声明:告知作用,可以有多次声明

变量的分类,作用域和生命周期

变量的分类

  1. 局部变量: 包含在代码块中的变量。它具有临时性,进入代码块,自动形成局部变量,退出代码块自动释放

  2. 全局变量: 在所有函数外定义的变量。它具有全局性

    用{ }括起来的区域,就是代码块

#include <stdio.h>
#include <windows.h>
int g_x = 100; //全局变量

int main()
{
	int x = 10;//局部变量,main函数也是函数,也有代码块{}
	printf("x:%d\n", x);
	
	system("pause");
	return 0;
}

变量的作用域

作用域: 指的是该变量可以被正常方面的代码区域(改变量的有效区域) 针对的是影响范围
局部变量的作用域:只在本代码块内有效;全局变量的作用域,整个程序运行期间,都有效。

#include <stdio.h>
#include <windows.h>

int main()
{
	int x =10;
	if (x == 10)
	{
		int y= 20;
		printf("局部:x: %d, y: %d\n",x,y);//y只能在本代码块内有效
	}
	printf("局部:x:%d,y: %d\n",x,y);//报错,y不能被访问
	system("pause");
	return 0;
}	
#include <stdio.h>
#include <windows.h>
int g_x = 100;//全局变量

void show()
{
printf("show:全局:%d\n",g_x);//在任何代码块中都可以被访问
}

int main()
{
	show();
	printf("main: 全局:%d\n",g_x);//在任何代码块中都可以被访问,甚至被修改
	system("pause");
	return 0;
}
#include <stdio.h>
#include <windows.h>

int g_x= 100;//全局变量

int main()
{
	int g_x = 10;//局部变量,与全局同名
	printf("g_x:%d\n",g_x);//输出的是局部,也就是局部和全部同名的时候,局部有先 。所以,强烈不建议这样
	system("pause");
	return 0;
}

变量的生命周期

生命周期: 指的是该变量从定义到被释放的时间范围(什么时候开辟,什么时候释放),所谓的释放,指的是曾曾经被开辟的空间"被释放"。针对的是时间长短

  1. 局部变量: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量(作用域:局部范围内有效);
  2. 全局变量: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效(作用域:全程)

作用域 VS 生命周期

在这里插入图片描述

auto-最宽宏大量的关键字

  1. 使用方式:一般在代码块中定义的变量,即局部变量,默认都是auto修饰的,不过一般省略。
  2. 对象:一般用来修饰局部变量(自动变量,临时变量)
  3. 作用:修饰局部变量
#include <stdio.h>
#include <windows.h>

int main()
{
	for (int i = 0; i < 10; i++)
	{
		printf("i=%d\n",i);
		if(1)
		{
			auto int j = 0; //自动变量
			printf("before: j=%d\n", j);
			j += 1;
			printf("after : j=%d\n", j);
		}
	}
	system("pause");
	return 0;
}
  1. 结论:基本永不使用

register-最快的关键字

cpu主要是负责进行计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到cpu中,那么也就需要cpu具有一定的数据临时存储能力。注意:cpu并不是当前要计算了,才把特定数据读取到cpu里面,那样会特别慢

所以在现代cpu内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存。

存储分级(存储金字塔)

在这里插入图片描述
距离cpu越近的存储硬件,速度越快,效率越高,单价成本越贵
其实对于任何一种硬件而言,它充当着上游硬件的缓存(类似硬盘中的数据可以在内存中缓存,而内存中的数据可以在cpu中缓存)。cpu访问数据的时候,以最小的成本来达到最高的效率。

寄存器

  1. 定义:简单来说,就是距离cpu最近的存储硬件 而它就是cpu内集成了一组存储硬件,这个硬件就是寄存器
  2. 本质:在硬件层面上,提高计算机的运算效率。因为他不再需要从内存读取数据了。

register修饰变量

  1. 作用:尽量将所修饰的变量,放入cpu寄存器中,从而达到提高效率的目的
  2. 条件:① 局部的(全局会导致cpu寄存器被长时间占用)② 不会被写入的(赋值)(写入就需要写回内存,如果还有检测的话,register的意义在哪里?) ③ 高频 被读取的( 提高效率所在)④ 如果要使用,请不要大量使用,因为寄存器数量有限
  3. register修饰的变量,不能取地址(因为已经存在于寄存器中,地址是内存相关的概念)
#include<stdio.h>
#include<windows.h>

int main()
{
	register int a=0;
	printf("&a=%p\n",&a);
	//编译器报错:错误 1 error c2103:寄存器变量上的“&”(寄存器不属于内存范围)
	system("pause");
	return 0;
}
  1. 建议:该关键字不用管,也不用使用,因为现在的编译器已经很智能,能够进行比人更好的代码优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值