常见关键字
关键字的深层次理解及作用
我在写博客之前看了其他优秀的作品,都是在讲些关键字都有啥,关键字的每个作用都是啥,但作为一个学生来讲(我有点笨,学识太浅),根本不知道关键字到底有啥用,以及为什么要出现关键字,这里我就给大家说一下为什么要有关键字呢
这是我在我网上找到的解释:C语言中的关键字是C语言开发者在开发时定义有特殊 意义的字符,编译器通过这些关键字编译器才能对你的代码进行解释
以及关键字在c语言的作用:C语言中的关键字是极其重要的。这就好比一个企业的各个部门,如果你是老板,你可以根据自己的要求加入一些新的部门,也可以去除或改组一些无用部门,但是有一些最基本的部门是不能变的,这就是企业中的“关键字”。“关键字”是任何编程语言所必有的,是系统定义的最底层最根本的东西,如int, float等,可以声明数据类型,只有告诉计算机具体使用的类型,它才能准确无误的运行。
在这些内容中我也深受启发,哦原来c语言中的关键字是这么理解的,就像我们人类最开始发明东西也一样,最开始都会有一些基本的工具,如木头啊,石头啊等等这些最基本的东西到最后发明了现在超级厉害的武器等,关键字也是一样它就是c语言自身会带着的,按照这些关键字及一些语法进而写出你想要的东西。
既然我们知道c语言关键字是什么有什么作用了我们接下来讨论在c语言中都有哪些关键字呢
关键字的分类及每个关键字的作用
先声明一下,这里只会讲一些最基础的关键字知识,如果后面有学过更深的我会在后期进行总结归纳,及一些我的讲解
我将c语言中的关键字分为这几类 操作符类,结构体类,数据类型类,循环语句类,选择语句类,switch语句类,声明定义类,语言存储类型类,特殊类。
操作符类
sizeof(我在前面讲过),计算变量及变量类型大小,单位是字节
结构体类
struct:是一种结构体,需要自己定义每个结构体成员
union:联合体,后期会讲
数据类型类
char,int,float,long,long long,double,short,enum,signed,unsigned
前面都给大家讲过,都是定义变量的类型,这里我给大家讲讲signed和unsigned
signed(有符号整形):有符号就是代表有正负号,范围较大,比如(signed 可省略)int的范围为-32768——32767
unsigned(无符号整型):无符号就是没有符号,范围较小,范围是0——65535,比如我们定义一些属性没有符号的情况下就用它定义就好(比如我们定义年龄性别书籍等等)。
循环语句类
有while,for,break,continue。
选择语句类
if,else及它们的结合使用。
Switch语句
以上三个语句类我们会在下一篇文章仔细讲解。
声明定义类
typedef:typedef叫做类型重命名
作用:在程序中经常正确的使用 typedef 可以有效的增加代码的可读性、可维护性
在变量名字声明前面加上typedef,将变量提升为这个类型的别名(alias)
我们举个例子
#include<stdio.h> typedef unsigned int u_int; int main() { unsigned int; return 0; }
应该很简单就是我们在后面的代码还要继续用到unsigned int由于太长了写的比较麻烦我们就给他起了个小名便于简洁方面提高代码的可读性和维护性。
语言存储类型类
auto,register,extern,static
auto:叫做自动变量跟局部变量一样其实我们变量都可以写成auto int但是我们经常省略,一个意思也是创建了作用域就开始,出了作用域就结束销毁。
extern:我们都用它进行声明外部的变量,我们进行写代码时候有时会创建多文件形式进行创建工程,这时我们就需要它来声明一下多个文件就可以联系在一起。
register :在计算机里叫做寄存器,寄存器是什么呢?我们看一下官方解释
寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。寄存器是中央处理器内的组成部分。寄存器是有限存储容量的高速存储部件,它们可用来暂存指令、数据和位址。
可见寄存器在内存中的存储作用有多大,既然讲到寄存器我们给大家上图带你具体了解内存中是怎样存储的
我给大家分析一下,比如你打开了一个软件这时外存就会给内存发信号说我要存储数据了,然后内存接到指令就给cpu传送信号同时也给高速缓存器发送一段程序块告诉它我要存储数据了,如果cpu里没有数据了就回去高速缓存器里调用,高速缓存器里没有就申请内存,内存没有继续向外存申请。(cpu直接从内存中存取数据时要等待一定时间周期,而Cache则可以保存cpu刚用过或循环使用的一部分数据,如果cpu需要再次使用该部分数据时可从Cache中直接调用)
还有一个更加详细的图(这些都是我在网上寻找的大家也可以去学习一下)
图上也写了从下往上更小更快另外成本也越高。
这里给大家扩展一下内存存储的一些知识
既然register这么厉害那在c语言有啥作用的
#include<stdio.h> int main() { register int a; return 0;
这里只是建议把a放在寄存器。虽然只是建议那也比不建议好,这样就说明如果要存储数据我们就先把a暂时存储。这样我们在使用register时候如果有数据很重要我们就先把它放在register中先暂时存储。但切忌不要把任何的代码前面都放上register,这样内存的存储就乱套了。
static:叫做静态变量字面理解是以动化静。
提到这个我们现在前面讲一下内存的分区吧
这里我先知道 全局栈区和局部栈区(也叫作静态栈区)或许下面这个图能让我们更好地理解static
我们正式讲static前先讲这个代码
static修饰局部变量
#include<stdio.h> void test() { int a = 1; a++; printf("%d ", a); } int main() { int i = 0; for (i = 0; i < 10; i++) { test(); } return 0; }
这个代码的理解应该是这样的从i= 0;开始循环10次执行test函数,在test里将a赋值1,然后a++,但你可别忘了a是局部变量,出了test函数的作用域是会被销毁的等循环再次进入test函数的时候a还是赋值1,而不是我们想的从2开始继续++;
看打印结果
对我们不是在讲static么跟这个函数有毛关系(别着急下面就是了)。
我们说static叫什么来着,对叫静态变量那我们加上static会打印什么结果呢?
看代码及打印截图
#include<stdio.h> void test() { static int a = 1; a++; printf("%d ", a); } int main() { int i = 0; for (i = 0; i < 10; i++) { test(); } return 0; }
这时候你也就会想到了,与上面的那个相比,此时加入static该全局变量不会销毁了,而是继续执行a++;
刚才我们说到内存的分区此时就要用到了,局部变量是存放在栈区,而当static修饰局部变量的时候改变了它的存储类型变为静态区,此时生命周期也变长,让静态变量的生命周期一直到程序结束才会销毁。
结论:static修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
static修饰全局变量
举个例子看代码
#include<stdio.h> int main() { extern int g_val; printf("%d\n", g_val); return 0; }
看打印结果
这个代码利用了extern来声明外部add.c这个文件,这样才能在内部test.c里使用
那我们看看用static修饰又会怎么样呢?
static int g_val = 2021;
(这是add.c文件)当我们运行时候会报错
这是我们就分析一下,由于static修饰全部变量的时候就会报错这是因为我们说全局变量具有外部链接属性(外部链接属性是指当我们定义一个源文件能在整个工程中使用),而用static修饰局部变量的时候外部链接属性就变成了内部连接属性(定义一个源文件只能在本源文件内部使用)也就相当于作用域就变小了。
static修饰函数
举个例子看代码
#include<stdio.h> extern int Add(int a, int b); int main() { int a = 10; int b = 12; int ret = Add(a, b); printf("%d\n", ret); return 0; }
//定义一个函数 int Add(int a, int b) { int z = a + b; return z; }
打印结果
如果加了static呢
static int Add(int a, int b) { int z = a + b; return z; }
与局部变量一样因为函数本身就在main函数外部定义的因此具有外部链接属性,而加了static之后呢就会变成内部连接属性
结论 :static可以修饰局部变量
static修饰局部变量改变了变量的生命周期 让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
static可以修饰全局变量
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使 用。
static可以修饰函数
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
#define定义的标识符常量和定义宏
#include<stdio.h> //define定义标识符常量 #define MAX 1000 //define定义宏 #define ADD(x, y) ((x)+(y)) #include <stdio.h> int main() { int sum = ADD(2, 3); printf("sum = %d\n", sum);//宏 printf("%d\n", MAX);//标识符常量 return 0; }
define标识符常量我们在前面讲过我们在这里讲一下宏
带参数的宏定义不是仅仅进行简单的字符串替换,还要进行参数替换。
#define ADD(x, y) ((x)+(y))
带参数的宏定义比较简单,就是用一个指定的标识符来代表一个字符串
#define E 2.718281828459
define是c语言的一种预处理指令这个我们在进阶部分会进行详细的探讨