前言
C语言一共有32个关键字如下:
一、定义与声明
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
1.什么是变量?
在内存中开辟特定大小的空间,用来保存数据 关键字:内存
2.如何定义变量(怎么用)
int x = 10;
char c = 'a';
double d = 3.14;
3.为什么要定义变量(为什么)
//理解链 计算机是为了解决人计算能力不足的问题而诞生的。即,计算机是为了进行计算的。 而计算,就需要数据。 而要计算,任何一个时刻,不是所有的数据都要立马被计算。 如同:要吃饭,不是所有的饭菜都要立马被你吃掉。饭要一口一口吃,那么你还没有吃到的饭菜,就需要暂时放在盘子里。 这里的盘子,就如同变量,饭菜如同变量里面的数据。 换句话说,为何需要变量?因为有数据需要暂时被保存起来,等待后续处理。 那么,为什么吃饭要盘子?我想吃一口菜了,直接去锅里找不行吗?当然行,但是效率低。 因为我们吃饭的地方,和做饭的地方,是比较"远"的。
4.变量定义的本质
我们现在已知: 1. 程序运行,需要加载到内存中 2. 程序计算,需要使用变量
那么,定义变量的本质:在内存中开辟一块空间,用来保存数据。(为何一定是内存:因为定义变量,也是程序逻辑的一部 分,程序已经被加载到内存)
二、变量
这个关键字书上讲的比较浅,提了一下就过去了,接下来我给大家详细讲解
1.变量的分类
局部变量:包含在代码块中的变量叫做局部变量。 局部变量具有临时性。进入代码块,自动形成局部变量,退出代码块自动 释放。 [网上很多说函数中的变量是局部变量,不能说错,但说法是不准确的] 全局变量:在所有函数外定义的变量,叫做全局变量。全局变量具有全局性。 代码块:用{}括起来的区域,就叫做代码块
#include <windows.h>
int g_x = 100;
int main()
{
int x = 10;
printf("x:%d\n", x);
return 0;
}
2.变量的作用域
作用域概念:指的是该变量的可以被正常访问的代码区域
#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);
}
printf("局部: x: %d, y: %d\n", x, y);
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);
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);
return 0;
}
3.变量的生命周期
生命周期概念:指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间”被释放“ 局部变量: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量 全局变量: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效 //通过上面的例子,我们能感知一二,不过真正说清楚,需要等函数讲完,在谈一下。 //尽管,上面理解也没问题。
四、auto 相关
如何使用:一般在代码块中定义的变量,即局部变量,默认都是auto修饰的,不过一般省略 默认的所有变量都是auto吗?不是,一般用来修饰局部变量 后面我们所到的,局部变量,自动变量,临时变量,都是一回事。我们统称局部变量
#include <stdio.h>
#include <windows.h>
int tmp=0;
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);
}
}
return 0;
}
思考:i用auto修饰可以吗?去掉j的auto可以吗? 都是可以修饰的 但是这个tmp不可以,因为auto只修饰局部变量 结论:已经很老,基本永不使用。
五、register关键字
其实,CPU主要是负责进行计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到CPU内,那么也就需要CPU具有一定的数据临时存储能力。注意:CPU并不是当前要计算了,才把特定数据读到CPU里面,那样太慢了。 所以现代CPU内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存。 距离CPU越近的存储硬件,速度越快。
1.寄存器的认识
当前各位伙伴可以不关系硬件细节,只要知道CPU内集成了一组存储硬件即可,这组硬件叫做寄存器。
2.寄存器存在的本质
在硬件层面上,提高计算机的运算效率。因为不需要从内存里读取数据啦。
3.register 修饰变量
尽量将所修饰变量,放入CPU寄存区中,从而达到提高效率的目的
那么什么样的变量,可以采用register呢?
- 局部的(全局会导致CPU寄存器被长时间占用)
- 不会被写入的(写入就需要写回内存,后续还要读取检测的话,register的意义在哪呢?)
- 高频被读取的(提高效率所在)
- 如果要使用,请不要大量使用,因为寄存器数量有限
这里除了上面的,再有一点,就是register修饰的变量,不能取地址(因为已经放在寄存区中了嘛,地址是内存相关的概念)
#include <stdio.h>
int main() {
register int a = 0;
printf("&a = %p\n", &a);
return 0;
}
我的意见:该关键字,不用管,因为现在的编译器,已经很智能了,能够进行比人更好的代码优化。 早期编译器需要人为指定register,来进行手动优化,现在不需要了
总结
今天更细致讲了变量的内容和函数的声明和定义,还讲了两个关键字auto和register关键字,接下来剩余的关键字我们会慢慢往下讲解,尽情期待吧!! 希望大家三连支持哦!!
|