目录
什么是C语言?
1 第一个C语言程序
1、创建项目
2、写代码
2.1 新建源文件
2.2 运行代码
2 数据类型
3 变量、常量
3.1定义变量的方法
3.2变量的分类
3.3变量的使用
3.4变量的作用域和生命周期
3.5常量
4 字符串+转义字符+注释
4.1字符串
4.2 转义字符
4.3注释
什么是C语言?
人和人交流用:中文、英文、日语
人和计算机交流用:计算机语言(包括C/C++/Java/python……)
即C语言是一种常见的计算机语言
C语言是一门通用的计算机编程语言,广泛应用于底层开发。刚买的电脑是硬件,铁疙瘩,怎么让它工作呢?原因是上面装有操作系统,常见的操作系统有:Windows、linux、Mac。操作系统是怎么让这个铁疙瘩工作起来的呢?有一个东西把操作系统和硬件关联起来,这个东西是驱动层(常说装网卡驱动或显卡驱动指的就是驱动)这个驱动其实是跨过操作系统和硬件之间,用操作系统来把硬件很好的调用起来。
操作系统上可以装微信、QQ、百度网盘等应用软件,即在操作系统之(是应用层)上可以装很多应用软件。操作系统及一下称为底层(或下层),所以对操作系统、硬件及操作系统和硬件之间的驱动层的开发用C语言是最多的,这些地方如需要一个操作系统,需要写一些驱动等这些东西是下层或底层软件。C语言广泛适用于底层(下层)开发,较擅长于底层开发,C语言可以写上层软件,如可以写QQ等。
C语言的发展引入了C语言的标椎:计算机识别的是二进制,用一个二进制代表一个意思,比如一个二进制序列起名叫ADD(加法)或SUB(减法),即具有某种意思,帮助我们把某些二进制记住了,例如记不住你的身份证号码但记住你叫张三,这样的符号是助记符,助记符是帮助我们来记住的,即像ADD或SUB等叫助记符,有了这些助记符就有了一门汇编语言,接下来就用汇编语言写代码了就不用二进制写代码了。后来在汇编语言的基础上发明了B语言,在B语言基础上又发明了C语言,初始的C语言不够成熟和完整,各个厂商就可能对C语言进行定制,对C语言增加语法,C语言形成了差异,所以就出现了C语言的国际标椎叫:ANSI C(ANSI C有好几个版本)。C语言之父定制的C语言标准是:K&R(两个人名字含有的字母),之后又有的标准有:C89、C90、C99……C11、C17,现在主流的标准是C89和C90,C99之后就使用的比较少了。
写C时写test.c、add.h这些文件怎么运行起来的呢?经历了什么?其实并没有把这些文件运行起来,C语言在运行时需要编译器,把代码进行编译,虽然写出的是test.c这样的文件,但最终实际上我们会编出一个像test.exe这样的文件,中间会经过编译器。经编译器处理后形成可执行程序,现在有哪些编译器呢?VS2019是集成开发环境,里面掉了一个编译器 :cl.exe。(经常说是msvc这样一个编译器)
常见的编译器有GCC、Clang、WIN-TC、SUBUME、MSVC、Turbo C等,VS2019里集成的是MSVC编译器,GDP是调试器不是编译器。集成开发环境是把各种各样的功能集成到里面去,有编辑功能,依赖的是编辑器,可以编辑东西,编辑好了后可以编译,也有编译器在里面,还有链接器,调试器。VS2019集这些功能于一身所以是集成开发环境。
1 第一个C语言程序
1、创建项目
(项目名称:如test_11_2是带_而不是带.的)(我统一放在D盘的2021_code中了)
2、写代码
写C语言代码就是写.c .h这样的文件
xxxx.c这样的文件在C语言中是源文件;
xxxx.h这样的文件在C语言中是头文件。
2.1 新建源文件
(头文件),名称是:test.c(若是test.cpp时是编译器用C++的语法来解析的,写test.c时是用C语言的语法来解析的)(可以不用test可以自己起名的,可以用中文的但不建议,一般用英文,因为VS是外国人开发的,对英语的支持比较好)。
主函数的写法: 大括号是函数体。int main()中int表示整型,表示这个函数运行结束后返回一个整型的值。return 0这里的0是整数,在main函数结束的时候返回,所以main函数前面的int和后面的return 0是前后呼应的。语法要求,写法固定。C99中main函数就是这样写的。
void main()
{
}
这种的写法是很久之前的,C99之前,现在没有人这样写了(书上加void是空白的意思,相当于没加。)
有些直接写main没有int的是坚决不支持的。例如:
main()
{
}
这种,既没有给main函数类型是什么又没有说明返回类型是什么,结束没有返回,而是采用默认(main函数默认是返回int的)这是坏的习惯。应该函数要返回什么就明确返回什么
再写入printf("hello worldn");和头文件#include
注:头文件
2.2 运行代码
ctrl+F5或ctrl+Fn+F5
(fn是辅助功能键,单按F2、F5(F1-F12)等是有特殊意义的,Fn+F5(或其他F几)才是真正F5的功能)
注写C语言代码时首先要知道main函数。main函数的作用:执行代码的入口。写几百行或更多代码这么多代码不是从第一行开始执行的,main函数是程序的入口,程序是从main函数的第一行开始执行的。按F10代码从main函数的第一行开始执行,所以main函数必须有但main函数有且仅有一个。main函数也称主函数。
C语言打印有打印函数,printf函数。printf函数的使用:例如打印:hello world,则:printf()圆括号里是想打印的东西,字符串(字符组起来的串)是用双引号引起来的,所以printf(“hello worldn”)这是语法形式。printf函数是一个库函数,库函数是别人的函数(库里提供的函数)使用别人的东西要向别人打招呼,这时就要包含头文件,即库函数的使用得包含一个头文件stdio.h
即包含的语法形式:#include
要用printf库函数函数即需要包含头文件:#include
否则编译器会显示:printf函数未定义
语法就是规定了怎么写代码是正确的,即规定了代码书写的规则。如汉语的语法:我吃饭了——是符合语法的;吃饭我了——是不符合语法的。
2 数据类型
C语言是用来写代码的,写代码是用来解决问题的,写个代码,写个软件来解决问题。C语言写出来的代码要解决问题则必须能描述问题,如写代码能描述现实生活中各种各样的数据类型。写代码是用来描述现实事件的。
C语言提供的数据类型:
char 是字符数据类型
short 是短整型(写全的话应该叫short int)
int 是整型
long 是长整型(写全的话应该是long int)
long long是更长的整型
float 是单精度浮点数(在这以上short、int、long、long long这4个是整型,以下这两个是浮点型)
double 是双精度浮点数
每一种数据类型都有其作用。表示一个字符是用char,短整型用short。
浮点型意思是如:31.45可以写成:3.145*10^1,可写成0.3145*10^2发现小数点是可以浮动的所以叫浮点数,C语言中提供能描述浮点数类型的有两种,即float单精度浮点数和double双精度浮点数,两者的区别是双精度的精度比单精度的精度高,希望精度更高,小数点后的位数更多则用double,精度低用float即可。
如描述一个人的年龄,年龄是整数,则用int类型或短整型short int。
若过了一年再:age=age+1
即这是数据类型的用途。
若:描述3.14,是小数则定义float类型,起名叫pai,,然后赋值:float pai=3.14f;
3.14后面写f表明是float类型的数据,f大小写都可以,如果后面没有f则编译器默认3.14是double类型的数据。若写成double类型,则精度会更高一些:double pai=3.141592653;
为什么出现这么多的类型?整型细化成4种,浮点型分成2种,为什么细化成这些呢?
每种类型的大小是多少?——以上数据类型分别占有多大空间呢?怎么来计算一个数据类型所创建变量占据内存空间的大小呢?用关键字:sizeof
C语言中的sizeof是用来计算变量或者使用类型创建变量的大小,单位是字节。
同样:
计算各数据类型所占空间的大小:
char类型所创建的变量大小是:
sizeof计算结果的单位是字节。计算机中是2进制的:0-1;
10进制:0-9
8进制:0-7
存放一个二进制时(比如说存放一个1或者一个0需要多大空间呢)
在内存中存放1,则需要一个小格子存放即可;存放0时也只需要一个小格子,把一个这样最小的格子(的空间大小)叫做1个比特位(1bit位),即是计算机中的最小的单位
现在把8个这样的比特位放在一起,这块空间的大小叫一个字节(byte)
即一个字节是8个比特位。
计算机中的单位再往上有:kb、mb、gb、tb、pb……
单位的计算:1byte=8bit
1kb=1024byte
1mb=1024kb
1gb=1024mb
1tb=1024gb
1pb=1024tb
char是1个字节,一个short是2个字节,一个int是4个字节,一个long也是4个字节,long long是8个字节,float是4个字节,double是8个字节,即是创建的这些类型变量在内存中所占空间的大小。
一个比特位要存放数据的话要么存放的是1要么存放的是0,一个比特位只能表示两种(2^1)意思,一个比特位存的是1表示是真,存0表示假,如果两个比特位则可以存放00、01、10、11四种(2^2)状态。如果用8个比特位00000000、00000001、00000010……11111111能表示2^8种状态,即能表示256个数字。
short是2个字节,是16个比特位,16个比特位能表示的数字是2^16种。
一个int是4个字节,是32个比特位,32个比特位能表示的数字的范围是2^32种。
即一个int表示范围的广度比一个short要更广。
若表示一个人的年龄,年龄不超过4位数,数字不大,所以创建一个人的年龄的变量时考虑用short即可,用short age,而不需要用int了,int age太大了,好多空间都浪费了,即提高了空间的利用率。因为一个short表示的范围已经到0~65535(16个1)了,已经是5位数了,而一个人的年龄是不会超过5位数的。
这么多类型的存在?——即提供了丰富的类型让我们进行合理的选择,则对于内存的利用率会更高一些。选择最适合的类型使用。存在这么多的类型,其实是为了更加丰富的表达生活中的各种值。
long长整型和整型int一样长,C语言标准并没有规定long是几个字节,规定了sizeof(long)>=sizeof(int)即可,只要long的大小大于等于int,并没有规定long具体多大。
(注:printf(“%dn”,)表示打印一个数字),所以printf(“%dn”,sizeof(char),sizeof(short))是错误的。若想打印两个数字则:printf(“%d %dn”,sizeof(char),sizeof(short))。
类型的使用是为了创建变量的。
char ch =‘w’;
int weight = 120;
int salary = 20000;
3 变量、常量
生活中有些值是不变的(比如:圆周率,性别,身份证号码,血型等),有些值是可变的(比如:年龄,体重,薪资)
不变的值在C语言中用常量的概念来表示,变得值在C语言中用变量来表示。
3.1定义变量的方法
int age = 150;
float weight = 45.5f;
char ch = 'w';
即:类型 变量名(类型+变量名)
注:变量不赋值是有问题的,不是一种好的代码风格。
变量在创建的时候不初始化是一种不好的风格。
即最好在变量创建的时候就赋给一个值。
当一个局部变量不初始化的时候,它的值是随机的(全局变量就不一样了)
int age;
age=age+1;
显然是错误的。原来的值不知道,后来也不知道会变成什么。
char类型的初始化:char ch = 'w';//把字符w放进去是初始化。char不初始化也会放随机的、不是预期的字符。(代码有问题)
3.2变量的分类
局部变量
全局变量
尽量全局变量和全局变量名字不同。
变量的创建是要在内存中开辟空间的。
3.3变量的使用
需要变量时就创建变量。
比如:两个整数相加
简洁的表示:
报错中讲到的scanf_s的函数时VS编译器提供的,不是C语言自己的,在其他的编译器下就没有scanf_s的函数,也不认识这个函数,当你在代码中使用了scanf_s函数,你的代码在其他的编译器(比如gcc、clong)下就没法正确的编译,这就降低了代码的跨平台性(移植性不够好),所以建议写代码尽量使用标准C提供的功能和函数。(scanf_s函数的使用和scanf是有区别的)
应该是:
创建好后直接赋值
但是这样的代码在一些老一点的编译器就跑不过去了。C99标准之前有一个规定:变量要创建在当前代码块的前面,一个{}就是一个代码块。直接写int sum = num1 + num2 ;这样是在后面定义了sum了。
注:在C99之后的语法就支持了:变量在哪里使用就在哪里定义就可以。
3.4变量的作用域和生命周期
作用域:(视力范围)哪里有权限哪里就是作用域
局部变量的作用域是它所在的局部范围
如果在大括号外定义一个变量,全局变量,则任意地方都可以使用
即打印了三份g。
但是若:
所以代码应该在函数内部写。而:若再写一个函数,在这个函数内部打印g是可以的。
注:以后代码多了也不是全部写在main函数里,函数会把代码分散开。以函数的形式写代码。
局部变量和全局变量都是可以改变的。变量本来也就是可以改变的量。
作用域指的是它在哪里可以使用。
局部变量的作用域:变量所在的局部范围,即它所在的{}
全局变量的作用域:任意地方都可以使用,即整个工程。一个工程有好多个源文件。
生命周期
一个人的生命周期是从出生到死去这整个时间段。
对于变量:
对于a变量来说,它的作用域是在它所在的大括号{}内部,它的生命周期是{开始创建出}到期、生命周期结束。
全局变量是当进入main函数开始执行时就可以使用。
main函数开始执行整个程序就开始执行,main函数执行结束时程序也就执行结束了。程序的生命周期和main函数的生命周期是一样的。
生命周期描述的是一个时间段,作用域描述的是能使用的代码范围。两者之间有关联但不等同。
局部变量的生命周期:进入局部变量所在的范围,生命周期开始,出局部变量所在的范围的时候,生命周期结束;
全局变量的生命周期:是整个程序的生命周期。
只要{}里定义的变量就是局部变量。
3.5常量
C语言中的常量分为以下几种:
①字面常量
②const修饰的常变量
③#define定义的标识符常量
④枚举常量
4 字符串+转义字符+注释
4.1字符串
注:字符串的结束标注是‘0’的转义字符,在计算字符串长度的时候‘0’是结束标志,不算字符串的内容。
4.2 转义字符
原因:结果不对是因为转义字符存在。
转义字符:转变原来的意思,还是字符,需要单引号引。(写在一个字符串里是不需要单引号引的如“henhe”)(只要是字符就需要单引号引)
在C语言中规定的转义字符还有:
?——释义是:在书写连续多个问号时使用,防止他们被解析成三字母词(在三字母词时使用,很少使用了,很多编译器不支持)
'——释义是:用于表示字符常量,即表示字符单引号
\——释义是:用于表示一个反斜杠,防止它被解释为一个转义序列符
a——释义是:警告字符,蜂鸣
b——释义是:退格符
f——释义是:进纸符
n——释义是:换行
r——释义是:回车
t——释义是:水平制表符,是键盘上的tab键(table),跳开一段,相当于几个空格,可以自己设置
v——释义是:垂直制表符
ddd——释义是:ddd表示1~3个八进制的数字。注:是斜杠后面跟1到3个数字默认是八进制(数字范围0-7)如:130代表的是X
xdd——释义是:dd表示3个十六进制数字。如:x30代表的是0
注:一个数组里不能放不同类型的数据,一个数组只能放相同类型的元素
4.3注释
C语言由两种注释方式:
①//:C99之后引入的注释方式,也是C++的注释风格
②注释就结束
使用注释的情况:
①代码复杂,对代码的解释,帮助(别人或自己)理解,方便看懂,梳理思路
②代码暂时不需要,注释掉的代码不参与编译



