0


【C语言】关键字

✨作者:@平凡的人1

✨专栏:《C语言从0到1》

✨一句话:凡是过往,皆为序章

✨说明: 过去无可挽回, 未来可以改变


文章目录

🍁了解关键字分类

C语言一共多少个关键字呢?

一般的书上,都是32个(包括本书),但是这个都是 C90(C89) 的标准。其实 C99 后又新增了5个关键字。

不过,目前主流的编译器,对 C99 支持的并不好,我们后面默认情况,使用 C90即认为32个

关键字及其说明

  1. auto****声明自动变量
  2. short****声明短整型变量或函数
  3. int****声明整型变量或函数
  4. long****声明长整型变量或函数
  5. float****声明浮点型变量或函数
  6. double****声明双精度变量或函数
  7. char****声明字符型变量或函数
  8. struct****声明结构体变量或函数
  9. union****声明共用数据类型
  10. enum****声明枚举类型
  11. typedef****用以给数据类型取别名
  12. const****声明只读变量
  13. unsigned****声明无符号类型变量或函数
  14. signed****声明有符号类型变量或函数
  15. extern****声明变量是在其他文件正声明
  16. register****声明寄存器变量
  17. static****声明静态变量
  18. volatile****说明变量在程序执行中可被隐含地改变
  19. void****声明函数无返回值或无参数,声明无类型指针
  20. if****条件语句
  21. else****条件语句否定分支(与 if 连用)
  22. switch****用于开关语句
  23. case****开关语句分支
  24. for****一种循环语句
  25. do****循环语句的循环体
  26. while****循环语句的循环条件
  27. goto****无条件跳转语句
  28. continue****结束当前循环,开始下一轮循环
  29. break****跳出当前循环
  30. default****开关语句中的“其他”分支
  31. sizeof****计算数据类型长度
  32. return****子程序返回语句(可以带参数,也可不带参数)循环条件

🍁理解变量、定义与声明

问题一:什么是变量

在内存中开辟特定大小的空间,用来保存数据

关键字:内存

问题二:如何定义变量(怎么用)❓

int a = 10;

char b = ‘a’;

double c = 3.14;

类型 变量名 = 默认值

问题三:为什么要定义变量(为什么)❓

计算机是为了解决人计算能力不足的问题而诞生的。即,计算机是为了进行计算的。

而计算,就需要数据。

而要计算,任何一个时刻,不是所有的数据都要立马被计算。

如同:要吃饭,不是所有的饭菜都要立马被你吃掉。饭要一口一口吃,那么你还没有吃到的饭菜,就需要暂时放在盘子里。

这里的盘子,就如同变量,饭菜如同变量里面的数据。

换句话说,为何需要变量?因为有数据需要暂时被保存起来,等待后续处理。

那么,为什么吃饭要盘子?我想吃一口菜了,直接去锅里找不行吗?当然行,但是效率低。

因为我们吃饭的地方,和做饭的地方,是比较"远"的

变量定义的本质

我们现在已知:

  1. 程序运行,需要加载到内存中
  2. 程序计算,需要使用变量

那么,定义变量的本质:

在内存中开辟一块空间,用来保存数据。(为何一定是内存:因为定义变量,也是程序逻辑的一部 分,程序已经加载到内存)


🍁三个关键字

最宽宏大量的关键字- auto

由于介绍auto涉及到变量,所以我们想从变量这个地方开始说起

变量的分类——补充内容
//局部变量:包含在代码块中的变量叫做局部变量。局部变量具有临时性。进入代码块,自动形成局部变量,退出代码块自动 释放。[网上很多说函数中的变量是局部变量,不能说错,但说法是不准确的] //全局变量:在所有函数外定义的变量,叫做全局变量。全局变量具有全局性。 //代码块:用{}括起来的区域,就叫做代码块  #include<stdio.h>#include<windows.h>int g_x =100;//全局变量 intmain(){int x =10;//局部变量,main函数也是函数,也有代码块{} printf("x:%d\n", x);system("pause");return0;}
变量的作用域—— 补充内容
//作用域概念:指的是该变量的可以被正常访问的代码区域  #include<stdio.h>#include<windows.h>intmain(){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");return0;}//局部变量:只在本代码块内有效 //例子同上 //全局变量:整个程序运行期间,都有效#include<stdio.h>#include<windows.h>int g_x =100;//全局变量 voidshow(){printf("show: 全局: %d\n", g_x);//在任何代码块中都可以被访问 }intmain(){show();printf("main: 全局: %d\n", g_x);//在任何代码块中都可以被访问,甚至被修改 system("pause");return0;}#include<stdio.h>#include<windows.h>int g_x =100;//全局变量 intmain(){int g_x =10;//局部变量,与全局同名printf("g_x:%d\n", g_x);//输出的是局部,也就是局部和全部同名的时候,优先局部。所以,强烈不建议这样system("pause");return0;}
变量的生命周期——补充内容

生命周期概念:指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间被释放

局部变量: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量

全局变量: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效

auto 相关
//如何使用:一般在代码块中定义的变量,即局部变量,默认都是auto修饰的,不过一般省略 //默认的所有变量都是auto吗?不是,一般用来修饰局部变量 //中断一下:后面我们所到的,局部变量,自动变量,临时变量,都是一回事。我们统称局部变量#include<stdio.h>#include<windows.h>intmain(){for(int i =0; i <10; i++){printf("i=%d\n", i);if(1){autoint j =0;//自动变量printf("before: j=%d\n", j); 
         j +=1;printf("after : j=%d\n", j);}}system("pause");return0;}

最快的关键字—— register

其实,CPU主要是负责进行计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到CPU内,那么也就需要CPU具有一定的数据临时存储能力。注意:CPU并不是当前要计算了,才把特定数据读到CPU里面,那样太慢了,所以现代CPU内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存。

怎么去理解呢?我们可以通过一幅图来理解:
image-20220621215621089
距离CPU越近的存储硬件,速度越快。

寄存器存在的本质 :在硬件层面上,提高计算机的运算效率。因为不需要从内存里读取数据

register 修饰变量尽量将所修饰变量,放入CPU寄存区中,从而达到提高效率的目的

问题来了:

那么什么样的变量,可以采用register呢?

  1. 局部的(全局会导致CPU寄存器被长时间占用)
  2. 不会被写入的(写入就需要写回内存,后续还要读取检测的话,register的意义在哪呢?)
  3. 高频被读取的(提高效率所在)
  4. 如果要使用,请不要大量使用,因为寄存器数量有限
  5. 这里除了上面的,再有一点,就是register修饰的变量,不能取地址(因为已经放在寄存区中了嘛,地址是内存相关的概念)
#include<stdio.h>#include<windows.h>intmain(){registerint a =0;printf("&a = %p\n",&a);//编译器报错:错误 1 error C2103: 寄存器变量上的“&” //注意,这里不是所有的编译器都报错//鉴于同学们刚开始学,不给大家增加负担,我们后面再慢慢引入另一个编译器。 system("pause");return0;}

我们不妨来测试一下:

image-20220621220239930

不过现在我们是不需要自己手动去加该关键字的了,原因:该关键字,不用管,因为现在的编译器,已经很智能了,能进行比人更好的代码优化。 早期编译器需要人为指定register,来进行手动优化,现在不需要了。

最名不符实的关键字 —static

全局变量和函数的两个结论**-**补充内容

  1. 全局变量,是可以跨文件,被访问的。
  2. 全局函数,是可以跨文件,被访问的。
修饰变量

1.修饰全局变量,该全局变量只能在本文件内被使用。

总结:static修饰全局变量,影响的是作用域的概念,函数类似。而生命周期是不变的。

2.修饰局部变量

voidfun1(){int i =0; 
     i++;printf("no static: i=%d\n", i);}voidfun2(){staticint i =0; 
    i++;printf("has static: i=%d\n", i);}intmain(){for(int i =0; i <10; i++){fun1();fun2();}system("pause");return0;}//结论:static修饰局部变量,变量的生命周期变成全局周期。(作用域不变)//修饰函数,该函数只能在本文件内被使用。

🚩结语

说来惭愧,今天又是摆烂的一天,不知不觉又快到了十二点,这一天天过的可真的快啊,本次就先到这里结束啦!🌹


本文转载自: https://blog.csdn.net/weixin_60478154/article/details/125400424
版权归原作者 平凡的人1 所有, 如有侵权,请联系我们删除。

“【C语言】关键字”的评论:

还没有评论