CSDN上的各位,大家好啊!我是你们的新朋友SAKURA。很高兴能入驻CSDN这个温暖的大家庭。今天来和大家分享一下C语言中的一些基础知识。
C语言的发展过程
我们都知道,人之所以区别于动物站在了世界的顶层是因为人类有思想,并且能将自己的思想以语言的形式表达出来,人与人之间可以用英语交流,也可以用中文交流。同样的,人与计算机交流也需要语言,一种双方都能听懂的语言,这就是计算机语言(二进制语言)。但是问题来了,计算机语言都是由0和1组成的,一般人基本上是记不住的,更别提使用了,所以为了方便记忆使用,人们又发明了汇编语言(ADD、SUB),来帮助记忆。但是汇编语言也不太符合需求,于是就诞生了B语言以及后来的C语言。但注意,此时的C语言还不是我们今天使用的C语言,因为一种语言它所处编译器环境不同,它编译出的结果可能也不同。总不可能一段代码在这家公司的编译器下编译出是这个结果,而在另一处却是截然不同的结果,那肯定不行呀。所以,在此之上,人们又定下了语言的国际标准。以C语言举例来说吧,最早是由美国的ANSI发布了C语言标准,被称为ANSI C或是C89,后又出现了C90,C99...总的来说,一种语言要想流传下去并且能被广泛使用,那必须要有一个大部分人所认同的国际标准。
C语言的应用方面
讲了半天C语言的发展历程,那C语言可以在哪些环境下使用呢?
我们先来看一下电脑的构造。工厂里生产出一台电脑,它只是一个空壳,一个大铁疙瘩(硬件)。要想让它运转起来,我们需要相应的操作系统,如Windows,Linux,在两者之间,还有我们说的驱动,这一部分是所谓计算机的底层。而在它之上,还有我们熟知的上层(应用层),也就是软件等应用。像现在说的C语言,就比较适合做底层开发,也就是操作系统这一块,当然,你要说上层软件它能不能写,也是可以的,我们熟知的QQ就是用C写成的,但是一般不太用C语言写上层软件,术业有专攻嘛。
C语言在VS下的具体场景及部分基础知识
我们所熟知的IDE有VS,DEV C++等等,这里介绍在VS2022下的编译情况。
首先,我们看一段代码
非常简单的一段代码,在第一行,我们引了一个“头文件” ,也就是工程本身就包含的一个文件。
#include,#是预处理指令,include是指包含,包含了一个stdio的头文件的意思。
为什么要引这个头文件呢?因为在它里面包含了很多函数,我们需要使用这些函数的时候就需要引用这些头文件,比如这里的printf函数,它就属于一个库函数,它要在屏幕上打印信息,我们要使用它就需要引用<stdio.h>得到它的支持。
int main是我们的主函数,每个工程里都需要一个主函数,也只能有一个主函数。(一个工程中可以有多个.c文件,但多个.c文件只能有一个main函数)
int在这里指函数的返回类型是整型,()是加在函数后面的操作符。return 0; 是main函数调用结束时与之相呼应的,表示最后返回的是一个整型。
一般来说,我们的主函数都写成int main()
{
return 0;
}
而有些书上采用的void main 不太推荐,因为那是比较古老的一种写法了。(这里的void指的是返回的是空类型)
数据类型
上文中提到了整型这种类型,在C语言中还有char,short,long,longlong,float,double等类型。
它们代表了什么呢?我们依次来看看吧。
char是字符数据类型,在内存中占据1个字节(8比特位);通常以%c %s打印。
short是短整型,在内存中占据2个字节(16比特位); 通常以%hd 打印。
int是整型类型,在内存中占据4个字节(32比特位); 通常以%d 打印。
long是长整型,在内存中占据4个字节(32比特位); 通常以%ld 打印。
longlong是更长的整型,在内存中占据8个字节(64比特位);通常以%lld 打印。
float是单精度浮点数,在内存中占据4个字节(32比特位);通常以%f 打印。
double是双精度浮点数,在内存中占据8个字节(64比特位);通常以%lf 打印。
再提一句,%u,%zu打印返回值为size_t(unsigned int类型)即无符号整型。%zu无法打印负数。
%p打印地址。
提到计算机中的单位,还是给小伙伴们普及一下:
计算机中最小单位是bit(比特)
1字节(byte)=8bit
1KB=1024字节
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
现在我想在屏幕上打印这些类型的大小,此时需要一个操作符sizeof,它是C语言中的一个关键字,用于计算类型或者变量的大小。来看一段代码:
运行结果在右边。
变量
变量的概念想必不需要我多说了吧,这里我们主要说下全局变量和局部变量。
全局变量就是在main函数外部定义的,在整个工程中都可以使用的变量。而局部变量就是main函数内部定义的,只在其内部有效。当局部变量和全局变量冲突时,以局部优先。例如:
作用域和生命周期
下面我们来看作用域和生命周期的概念。
作用域就是变量所在的作用区间。局部变量的作用域就是变量所在的局部范围,全局变量的作用域就是整个工程。
变量的生命周期:变量的创建和销毁的时间段。局部变量的生命周期:当变量进入局部范围,生命开始,出范围生命结束。 全局变量的生命周期就是程序的生命周期。
还是以上一段代码为例。
main函数外部的变量a被创建出来,随着程序的结束,它的生命周期也就跟着结束。
而main函数内部的变量a被创建出来,生命周期开始,当出了main函数,它的生命周期也就结束了。
常量
与变量相对应的是常量,也就是不变的量。
常量有以下几种:
1.字面常量 这也就是我们所说的字面意思的不变的量,例如:5.2 ,100 ,'a',“abcd”.......
2.const修饰的常量 ;例如:const int num 本身num是一个int类型的变量,在前面加了const修饰以后,就变成了常量,不能再修改它的值了。但它本质上还是个变量,只是有了常属性。
3.标识符常量 如#定义的标识符常量 : #define MAX 1000,这种类型的常量
4.枚举常量(可以一一列举的常量)枚举数默认从0开始,0,1,2.......
这种枚举类型的变量的未来可能取值。
例如,我们要例举性别常量。 enum Sex
{
MALE
FEMALE
SECRET
}
后面用到枚举的Sex只会有这三种值。
好了,今天的分享就打这里了,感谢大家!