?作者:@平凡的人1
?专栏:《C语言从0到1》
?一句话:凡是过往,皆为序章
?说明: 过去无可挽回, 未来可以改变
🍁了解关键字分类
C语言一共多少个关键字呢?
一般的书上,都是32个(包括本书),但是这个都是 C90(C89) 的标准。其实 C99 后又新增了5个关键字。
不过,目前主流的编译器,对 C99 支持的并不好,我们后面默认情况,使用 C90 ,即认为32个
关键字及其说明
-
auto 声明自动变量 -
short 声明短整型变量或函数 -
int 声明整型变量或函数 -
long 声明长整型变量或函数 -
float 声明浮点型变量或函数 -
double 声明双精度变量或函数 -
char 声明字符型变量或函数 -
struct 声明结构体变量或函数 -
union 声明共用数据类型 -
enum 声明枚举类型 -
typedef 用以给数据类型取别名 -
const 声明只读变量 -
unsigned 声明无符号类型变量或函数 -
signed 声明有符号类型变量或函数 -
extern 声明变量是在其他文件正声明 -
register 声明寄存器变量 -
static 声明静态变量 -
volatile 说明变量在程序执行中可被隐含地改变 -
void 声明函数无返回值或无参数,声明无类型指针 -
if 条件语句 -
else 条件语句否定分支(与 if 连用) -
switch 用于开关语句 -
case 开关语句分支 -
for 一种循环语句 -
do 循环语句的循环体 -
while 循环语句的循环条件 -
goto 无条件跳转语句 -
continue 结束当前循环,开始下一轮循环 -
break 跳出当前循环 -
default 开关语句中的“其他”分支 -
sizeof 计算数据类型长度 -
return 子程序返回语句(可以带参数,也可不带参数)循环条件
🍁理解变量、定义与声明
问题一:什么是变量?
在内存中开辟特定大小的空间,用来保存数据
关键字:内存
问题二:如何定义变量(怎么用)?
int a = 10;
char b = ‘a’;
double c = 3.14;
类型 变量名 = 默认值
问题三:为什么要定义变量(为什么)?
计算机是为了解决人计算能力不足的问题而诞生的。即,计算机是为了进行计算的。
而计算,就需要数据。
而要计算,任何一个时刻,不是所有的数据都要立马被计算。
如同:要吃饭,不是所有的饭菜都要立马被你吃掉。饭要一口一口吃,那么你还没有吃到的饭菜,就需要暂时放在盘子里。
这里的盘子,就如同变量,饭菜如同变量里面的数据。
换句话说,为何需要变量?因为有数据需要暂时被保存起来,等待后续处理。
那么,为什么吃饭要盘子?我想吃一口菜了,直接去锅里找不行吗?当然行,但是效率低。
因为我们吃饭的地方,和做饭的地方,是比较"远"的
变量定义的本质
我们现在已知:
-
程序运行,需要加载到内存中 -
程序计算,需要使用变量
那么,定义变量的本质:
在内存中开辟一块空间,用来保存数据。(为何一定是内存:因为定义变量,也是程序逻辑的一部 分,程序已经加载到内存)
🍁三个关键字
最宽宏大量的关键字- auto
由于介绍auto涉及到变量,所以我们想从变量这个地方开始说起
变量的分类——补充内容
#include <stdio.h>
#include <windows.h>
int g_x = 100;
int main()
{
int x = 10;
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);
}
printf("局部: x: %d, y: %d\n", x, 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;
}
变量的生命周期——补充内容
生命周期概念:指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间被释放
局部变量: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量
全局变量: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效
auto 相关
#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;
}
最快的关键字—— register
其实,CPU主要是负责进行计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到CPU内,那么也就需要CPU具有一定的数据临时存储能力。注意:CPU并不是当前要计算了,才把特定数据读到CPU里面,那样太慢了,所以现代CPU内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存。
怎么去理解呢?我们可以通过一幅图来理解:
距离CPU越近的存储硬件,速度越快。
寄存器存在的本质 :在硬件层面上,提高计算机的运算效率。因为不需要从内存里读取数据
register 修饰变量 :尽量将所修饰变量,放入CPU寄存区中,从而达到提高效率的目的
问题来了:
那么什么样的变量,可以采用register呢?
- 局部的(全局会导致CPU寄存器被长时间占用)
- 不会被写入的(写入就需要写回内存,后续还要读取检测的话,register的意义在哪呢?)
- 高频被读取的(提高效率所在)
- 如果要使用,请不要大量使用,因为寄存器数量有限
- 这里除了上面的,再有一点,就是register修饰的变量,不能取地址(因为已经放在寄存区中了嘛,地址是内存相关的概念)
#include <stdio.h>
#include <windows.h>
int main()
{
register int a = 0;
printf("&a = %p\n", &a);
system("pause");
return 0;
}
我们不妨来测试一下:
不过现在我们是不需要自己手动去加该关键字的了,原因:该关键字,不用管,因为现在的编译器,已经很智能了,能进行比人更好的代码优化。 早期编译器需要人为指定register,来进行手动优化,现在不需要了。
最名不符实的关键字 —static
全局变量和函数的两个结论 - 补充内容
-
全局变量,是可以跨文件,被访问的。 -
全局函数,是可以跨文件,被访问的。
修饰变量
1.修饰全局变量,该全局变量只能在本文件内被使用。
总结:static修饰全局变量,影响的是作用域的概念,函数类似。而生命周期是不变的。
2.修饰局部变量
void fun1()
{
int i = 0;
i++;
printf("no static: i=%d\n", i);
}
void fun2()
{
static int i = 0;
i++;
printf("has static: i=%d\n", i);
}
int main()
{
for (int i = 0; i < 10; i++)
{
fun1(); fun2(); }
system("pause");
return 0;
}
🚩结语
说来惭愧,今天又是摆烂的一天,不知不觉又快到了十二点,这一天天过的可真的快啊,本次就先到这里结束啦!🌹
|