文章目录
1. C语言是什么?
C语言即是一种可面向过程的编程语言。
2. C语言的起源和发展
B语言的诞生——》1969年,贝尔实验室的肯·汤普森(Ken Thompson)与丹尼斯·里奇(Dennis Ritchie)一起开发了Unix操作系统。Unix是用汇编语言写的,为了移植到其他计算机,汤姆森就在BCPL语言的基础上发明了B语言。
C语言的诞生——》1972年,丹尼斯·里奇和布莱恩·柯林汉(Brian Kernighan),又在B语言的基础上重新设计了一种新的语言,这种语言取代了B语言,称之为C语言。
Unix系统的重写——》1973年,整个Unix系统都使用C语言重新。此后,这种语言开始快速流传,广泛应用于各种操作系统和系统软件的开发。
C语言的标准化——》1988年,美国国家标准学会(ANSI)正式将C语言标准化,标志着C语言的确定和规范化。至今,C语言一直是被广泛使用的。
C语言知名度点击此处查看
3. 编译器的选择
C语⾔作为编译型计算机语⾔,C语⾔源代码都是⽂本⽂件,⽂本⽂件本⾝⽆法执⾏,必须通过编译器翻译和链接器的链接,⽣成⼆进制的可执⾏⽂件,可执⾏⽂件才能执⾏。如果不进行编译,C语言只是一堆英文单词符号,计算机是不懂的。
3.1 编译和链接
在计算机语言中,大致可以分为解释型语言(如:Python)和编译型语(C/C++)。 然而,通过字面意思可以知道编译型语言是需要通过编译(翻译)的。首先C语⾔代码是放在 .c 为后缀的⽂件中的,要得到最终运⾏的可执⾏程序,中间要经过编译和链接2个过程。在文件中呈现的是下图的样子:
- 每个源⽂件(.c)单独经过编译器处理⽣成对应的⽬标⽂件(.obj为后缀的⽂件)
- 多个⽬标⽂件和库⽂件经过链接器处理⽣成对应的可执⾏程序(.exe⽂件)
3.2 编译器的对比
我们常见的编译器有哪些?
比如:msvc、clang、gcc等常见的编译器,也有一些集成开发环境的软件如:VS2022、XCode、CodeBlocks、DevC++、Clion等。【集成开发环境(IDE)用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器、图形用户界面等工具,集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发环境】
VS2022——》集成了msvc(安装包较大、但安装简单、不需要多余配置、使用起来方便)。
XCode——》集成了clang(苹果电脑上的开发工具)。
CodeBlocks——》集承了gcc(工具比较小众、需要多余配置)。
DevC++——》集成了gcc(小巧、简单、一般用于竞赛)。
Clion——》是默认使用CMake,编译器是可以配置的(需要收费)。
【整体考虑,推荐⼤家安装 VS2022 的社区版本学习,免费,使⽤⽅便,⼯作中常⻅。】
vs2022优缺点—》
优点:
• VS2022 是⼀个主流的集成开发环境,企业中使⽤较为普遍
• VS2022 包含了:编辑器+编译器+调试器,功能强⼤
• 直接安装即可使⽤,基本不⽤额外配置环境,上⼿容易
• 默认界⾯是中⽂的,初学者友好
缺点:
• 功能丰富,安装包⼤,占⽤空间多。
4. 第一句C语言程序“Hello Word!”
#include<stdio.h>
int main()
{
printf("Hello Word!");
return 0;
}
4.1 main()函数
main()函数是程序的入口。称之为——主函数,该该函数会返回一个整形的数据。
- ①main容易写成mian,敲代码的时候小心。
- ②main()函数有且仅有一个,代码书写中不能书写多个main()函数。
- ③在多个xxx.c源文件中,也不能有多个main()函数
【注:①main 被写成了mian;②main后边的()漏掉了;③代码中不能使⽤中⽂符号,⽐如括号和分号;④⼀条语句结束后,有分号】
4.2 printf()函数
- 在上面代码块中有这么一句代码:
printf("Hello Word!\n");
代码中使⽤了 printf 函数,实现了在屏幕上的信息的打印。
这⾥简单的介绍⼀下 printf , printf 是⼀个库函数,它的功能是在标准输出设备(⼀般指屏幕)上进⾏信息的打印。上⾯的代码是使⽤ printf 函数打印字符串。只要把想要打印的⼀串字符放在双引号中并传递给printf函数就可以打印。
【使用它的前提就必须包含下面代码块中的头文件:】
#include<stdio.h>
4.3 库函数
库函数是指:为了不再重复实现常见的代码,让程序员提高开发效率,C语言标准规定了一组函数,这些函数再由不同编译器厂商根据标准实现,提供给程序员,这些函数就组成了一个函数库,称之为标准库。因此,里面的函数就成为库函数。
一系列的库函数一般会声明在同一个头文件中,在使用库函数时候记得引对应的头文件。库函数很多,此处有个链接包含一些库函数的头文件和解释:
C语言库函数链接
5. C语言关键字
关键字,在C语⾔中有⼀批保留的名字的符号,⽐如: int 、 if 、 return ,这些符号被称为保留字或者关键字。
关键字都有特殊的意义,是保留给C语⾔使⽤的
程序员⾃⼰在创建标识符的时候是不能和关键字重复的
关键字也是不能⾃⼰创建的。C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。接下来详细介绍关键字:
- 数据类型关键字(12个);
- 控制语句关键字(12个);
- 存储类型关键字(4个);
- 其它关键字(4个);
注:在C99标准中加⼊了 inline 、 restrict 、 _Bool 、 _Complex 、 _Imaginary 等关键字。
C语言全部关键字介绍链接
5.1 数据类型关键字(12个):
关键字 | 作用 |
---|---|
char | 声明字符型变量或函数 |
double | 声明双精度变量或函数 |
float | 声明浮点型变量或函数 |
int | 声明整型变量或函数 |
long | 声明长整型变量或函数 |
short | 声明短整型变量或函数 |
signed | 声明有符号类型变量或函数 |
unsigned | 声明无符号类型变量或函数 |
enum | 声明枚举类型 |
struct | 声明结构体变量或函数 |
union | 声明共用体(联合)数据类型 |
void | 声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用) |
5.2 控制语句关键字(12个):
循环语句:
for:一种循环语句(可意会不可言传)
do :循环语句的循环体
while :循环语句的循环条件
break:跳出当前循环
continue:结束当前循环,开始下一轮循环
条件语句:
if: 条件语句
else :条件语句否定分支(与 if 连用)
goto:无条件跳转语句(基本上用的很少)
开关语句:
switch :用于开关语句
case:开关语句分支
default:开关语句中的“其他”分支
返回语句:
return :子程序返回语句(可以带参数,也看不带参数)
5.3 存储类型关键字(4个):
- auto :声明自动变量 一般不使用
- extern:声明变量是在其他文件正声明(也可以看做是引用变量)
- register:声明寄存器变量
- static :声明静态变量
5.4其它关键字(4个):
- const :声明只读变量
- sizeof:计算数据类型长度
- typedef:用以给数据类型取别名(当然还有其他作用
- volatile:说明变量在程序执行中可被隐含地改变
6. 字符和ASCII码表
- 键盘上可以敲出各种字符:a,s,@等,这些都可以叫字符。重要的是在C语言中字符使用单引号(英文状态下)括起来的,如:‘a’, '@'等。然而,在计算机中所有数据都是用二进制形式存储的,那么问题来了——这些字符在内存中分别是用什么二进制存储的呢?因此,为了方便大家对它们进行相同样式的使用,美国国家标准学会(ANSI)出台了一个标准ASCII编码,C语言就遵循这样的编码存储。单个字符用%c打印。
这些不用全部记住,记住几个特殊的就欧克了:
①字符A~Z的ASCII码值从:65—90
②字符a~z的ASCII码值从:97—122
③对应的⼤⼩写字符(a和A)的ASCII码值的差值是32
④数字字符0~9的ASCII码值从48—57
⑤换⾏ \n 的ASCII值是:10
⑥在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,⽆法打印在屏幕上观察
下面是单个字符代码展示:
#include<stdio.h>
int main()
{
printf("%c\n", 'Z');//输出Z
printf("%c\n", 90);//ASCII码值和Z对用的,所及输出Z
return 0;
}
下面是打印字符代码展示:
#include<stdio.h>
int main()
{
int i = 0;
for (i = 32; i <= 127; i++)
{
printf("%c ", i);
if (i % 16 == 15)
printf("\n");
}
return 0;
}
7. 字符串和 \0
字符串就是由双引号引起来的那一部分,可以包含单个字母、英文语句、中文等。它和单个字符的主要区别就是:字符用单引号、字符串用双引号。字符后面没有’\0’、字符串在末尾有’\0’。
打印字符串用%s打印。
printf()函数和strlen()函数分别在打印字符串和求字符串长度的时候遇到’\0’就停止
对于字符串"hello word",我们实际上看到了10个字符:h,e,l,l,o, 有一个空格,w,o,r,d但是实际上在末尾还隐藏⼀个 \0 的转义字符, \0 是字符串的结束标志。所以我们在使⽤库函数 printf() 打印字符串或者strlen() 计算字符串⻓度的时候,遇到 \0 的时候就⾃动停⽌了。C语⾔中也可以把⼀个字符串放在⼀个字符数组中:
#include<stdio.h>
int main()
{
char arr1[] = { 'h','e','l','l','o',' ','w','o','r','d'};
char arr2[] = "hello word";
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
这段代码我们通过调试来观察他们的区别📺📺📺:
arr1 字符数组在打印的时候,打印了h,e,l,l,o, 有一个空格,w,o,r,d 后还打印了⼀些随机值,这就是因为 arr1 在末尾的地⽅没有 \0 字符作为结束标志,在打印的时候没有停⽌。
但是 arr2 的打印就是完全正常的,就是因为 arr2 数组是使⽤字符串常量初始化的,数组中有 \0作为结束标志,打印可以正常停⽌。
- 如果我们在arr1数组中单独放⼀个 ‘\0’ 字符会怎么样呢?
#include<stdio.h>
int main()
{
char arr1[] = { 'h','e','l','l','o',' ','w','o','r','d','\0'};
char arr2[] = "hello word";
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
看到这两次打印的结果是⼀样的了,都是打印到 \0 的时候就停⽌了,所以从上述的例⼦我们确实能够观察到 \0 的作⽤和重要性。
8. C语言转义字符
是C语言中的一组特殊的字符, 它们叫作转义字符,也就是字面意思【转变原来的意思的字符。】
⽐如:我们所看到的字符 n ,在字符串中打印的时候⾃然能打印出这个字符,如下:
要是我们修改⼀下代码,在 n 的前⾯加上 \ ,变成如下代码:
- 我们可以看到修改的前后代码输出的结果,截然不同的,那这是为什么呢?这就是转义字符的问题, \n 是⼀个转义字符表⽰换⾏的意思,我们可以简单的理解为 \ 让 n 的意思发⽣了转变,在编译器上可以看出颜色发生了变化, n 本来是⼀个普通的字符,被 \ 转义为换⾏的意思。
C语⾔中像这样的转义字符还有⼀些:
- \? :在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
- \’ :⽤于表⽰字符常量’
- \ " :⽤于表⽰⼀个字符串内部的双引号
- \\:⽤于表⽰⼀个反斜杠,防⽌它被解释为⼀个转义序列符。
- \a :警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。
- \b :退格键,光标回退⼀个字符,但不删除字符。
- \f :换⻚符,光标移到下⼀⻚。在现代系统上,这已经反映不出来了,⾏为改成类似于 \v 。
- \n :换⾏符。
- \r :回⻋符,光标移到同⼀⾏的开头。
- \t :制表符,光标移到下⼀个⽔平制表位,通常是下⼀个8的倍数,相当于键盘的Tab键。
- \v :垂直分隔符,光标移到下⼀个垂直制表位,通常是下⼀⾏的同⼀列。
下⾯2种转义字符可以理解为:字符的8进制或者16进制表⽰形式
• \ddd :d d d表⽰1~3个⼋进制的数字。 如: \130 表⽰字符X
• \xdd :d d表⽰2个⼗六进制数字。 如: \x30 表⽰字符0
\0 :null 字符,代表没有内容, \0 就是 \ddd 这类转义字符的⼀种,⽤于字符串的结束标志,其ASCII码值是0.
//C语言转义字符代码
#include<stdio.h>
int main()
{
printf("%c\n",'\'');
printf("%c\n",'\"');
printf("%s\n","c:\\test\\code\\test.c\n");
printf("c:\\test\\code\\test.c\n");//和上面一行结果一样的
printf("\a");//警报声音
printf("%c\n",'\130');//X
printf("%c\n",'\x30');
return 0;
}
9. C语言语句
- 我们从以上的代码可以看出C语言就是一条一条的代码组成的,这每一条以分号结尾的就叫作一条语句,在C语言中语句也可以大致分为五大类:
1.空语句
2.表达式语句
3.函数调⽤语句
4.复合语句
5.控制语句
9.1 空语句
空语句是最简单的,⼀个分号就是⼀条语句,是空语句。
#include<stdio.h>
int main()
{
;//在分号前面没有任何东西就是空语句
return 0;
}
- 空语句,⼀般出现的地⽅是:这⾥需要⼀条语句,但是这个语句不需要做任何事,就可以写⼀个空语
句。
9.2 表达式语句
表达式语句,字面意思就是一个可以计算的式子,在这个式子后面加一个分号就是表达式语句。
#include<stdio.h>
int main()
{
int a = 10;//定义变量
int b = 20;
int c = 0;
c = a + b;//表达式语句
return 0;
}
9.3 函数调用语句
就是在函数调用后面加分号。
#include<stdio.h>
int add(int x, int y)//函数定义
{
return x + y;
}
int main()
{
//打印函数也是调用语句
printf("你好呀!\n");//函数调用语句,只不过是调用的库函数
int ret = arr(10, 20);//函数调用语句,调用自定义的函数
return 0;
}
9.4 复合语句
用大括号括起来的就叫做复合语句,也就是所说的代码块。
9.5 控制语句
控制语句⽤于控制程序的执⾏流程,以实现程序的各种结构⽅式(C语⾔⽀持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语⾔有九种控制语句。
可分成以下三类:
- 分⽀语句:if语句、switch语句;
- 循环语句:do……while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
10. C语言注释
首先,注释是什么???在C语言中,它好比就是高中古文下面的解释,每个解释对应一个序号,在代码中也有解释,叫作注释。主要是对代码的说明,在编译器中注释是会被忽略的,不会执行。写了注释既方便自己理解,又方便其他程序员理解。当然,凡事都得有个度,注释过多,会让代码更乱。所以,不必要的注释,尽量不用写。
10.1 注释的两种格式
- /* xxxxx*/ 的形式。
- // xxxxx的形式。
【注意:不管是哪⼀种注释,都不能放在双引号⾥⾯。双引号⾥⾯的注释符号,会成为字符串的⼀部分,解释为普通符号,失去注释作⽤。】