一、C语言概念
目录
- 1.C语言是什么?
- 2.C语言的历史和辉煌
- 3.编译器的选择VS2022
- 4.VS项目和源文件、头文件介绍
- 5.第一个C语言程序
- 6.main函数
- 7.printf和库函数
- 8.关键字介绍
- 9.字符和ASCII编码
- 10.字符串和\0
- 11.转义字符
- 12.语句和语句分类
- 13.注释是什么?为什么写注释?
正文开始
1.C语言是什么?
(1)中级语言:直接操作硬件,兼具高级语言易读性与底层控制能力。
(2)结构化编程:函数和代码块组织程序。
(3)面向过程:以步骤和逻辑为核心,适合系统开发。
2.C语言的历史和辉煌
(1)1972年由丹尼斯·里奇为开发Unix系统设计。
(2)影响深远:C++、Java、Python等均受其启发。
(3)核心地位:操作系统(Linux/Windows)、嵌入式(单片机)、驱动开发的基础。
Windows(个人)、MaxOS(苹果)、Linux(服务器)、Unix(实验室)
3.编译器的选择-VS2022
3.1编译和链接
C语言是一门编译型计算机语言,C语言源代码都是文本文件,文本文件本身无法执行,必须通过编译
器翻译和链接器的链接,生成二进制的可执行文件,可执行文件才能执行。
C语言代码是放在·c为后缀的文件中的,要得到最终运行的可执行程序,中间要经过编译和链接2个
过程。
优势:集成开发环境(代码编辑+编译+调试),适合Windows平台。
其他工具:GCC(Linux)、Clang(跨平台),但VS2022对新手友好
一个工程一般都会有多个源文件组成,如下图,演示源程序经过编译器和链接器的过程图
注:
1.每个源文件(.c)单独经过编译器处理生成对应的目标文件(obj为后缀的文件)
2.多个目标文件和库文件经过链接器处理生成对应的可执行程序(.exe文件)
这就是,在Windows电脑上C语言程序生成的exe可执行文件
3.2编译器的对比
C语言是一门编译型的计算机语言,需要依赖编译器将计算机语言转换成机器能够执行的机器指令。
那我们常见的C语言编译器都有哪些呢?
比如:msvc、clang、gcc就是一些常见的编译器,当然也有一些集成开发环境如:VS2022、
XCode、CodeBlocks、DevC++、Clion等。
- VS2022集成了MSVC(安装包较大一些,安装简单,无需多余配置,使用起来非常方便)
- XCode集成了clang(苹果电脑上的开发工具)
- CodeBlocks集成了gcc(这个工具比较小众,需要配置环境,不太推荐)
- DevC++集成了gcc(小巧,但是工具过于简单,对于代码风格的养成不好,一些竞赛使用)
- Clion是默认使用CMake,编译器是可以配置的(工具是收费,所以暂时推荐大家使用)
3.3VS2022
优点:
- VS2022是一个主流的集成开发环境,企业中使用较为普遍
- VS2022包含了:编辑器+编译器+调试器,功能强大
- 直接安装即可使用,基本不用额外配置环境,上手容易
- 默认界面是中文的,初学者友好
缺点: - 功能丰富,安装包大,占用空间多。
4.VS项目和源文件、头文件介绍
在VS上写代码,我们是需要创建项目的,直接新建项目就可以了。
在项目中就可以添加源文件和头文件。
C语言把.c
为后缀的文件称为源文件,把.h
为后缀的文件称为头文件。
5.第一个C语言程序
1 #include<stdio.h>
2
3 int main()
4{ printf("Holle! N\n");
5 return 0;
6}
VS2022快捷运行键Ctrl+F5
6.main函数
每个C语言程序不管有多少行代码,都是从main函数开始执行的,main
函数是程序的入口,
main
函数也被叫做:主函数。main
前面的int
表示main
函数执行结束的时候返回一个整型类
型的值。所以在main
函数的最后写return 0;
正好前后呼应。
- main函数是程序的入口
- main函数有且仅有一个
- 即使一个项目中有多个.c文件,但是只能有一个main函数(因为程序的入口只能有一个)
7.printf和库函数
在上面的代码中有一句代码如下:
1 printf("hello C\n");
代码中使用了printf函数,实现了在屏幕上的信息的打印。
这里简单的介绍一下printf
,printf
是一个库函数,它的功能是在标准输出设备(一般指屏
幕)上进行信息的打印。上面的代码是使用printf函数打印字符串。只要把想要打印的一串字符放
在双引号中并传递给printf
函数就可以打印。
printf函数也可以用来打印其他类型的数据,比如:
2 printf("%d\n",n);//printf打印整型
3 printf("‰c\n", 'q'); //printf打印字符
4 printf("‰lf\n",3.14); //printf打印双精度浮点型
这里的%d,%c
等是占位符,会被后边的值替换。(后期课程再介绍)
同时我们在使用库函数的时候,是需要包含头文件的,比如:printf函数
需要包含的就是
stdio.h
这个头文件,具体的方法就是:
#include<stdio.h>
库函数是编程语言中预先封装好的功能模块,其本质是为开发者提供可复用的代码解决方案。在C语言中,标准库函数由ISO/IEC标准严格定义,各编译器厂商依据该规范进行实现。它们主要发挥以下核心作用:
- 消除重复开发 - 将字符串处理、数学运算、输入输出等高频操作标准化封装,避免开发者重复实现基础功能
- 保证跨平台一致性 - 通过统一的标准规范,确保同一函数在不同编译环境和操作系统中的行为一致性
- 提升开发效能 - 直接调用经过深度优化的可靠实现,相比自主开发更能保障执行效率和代码质量
8.关键字介绍
C语言中有一批保留的名字的符号,比如:int
、if
、return
,这些符号被称为保留字或者关键
字。
- 关键字都有特殊的意义,是保留给C语言使用的
- 程序员自己在创建标识符的时候是不能和关键字重复的
- 关键字也是不能自己创建的。
C语言的32个关键字如下:
1 break double else char auto continue default do const case enum extern
2 float for if long short signed sizeof return goto int register static
3 struct switch typedef union unsigned void volatile while
注:在C99标准中加入了inline
、restrict
、Bool
、Complex
、_Imaginary
等关键
字。
9.字符和ASCII编码
在键盘上可以敲出各种字符,如:a,q,@,#等,这些符号都被称为字符,C语⾔中字符是⽤单引号
括起来的,如:‘a’,‘b’,‘@’。
我们知道在计算机中所有的数据都是以⼆进制的形式存储的,那这些字符在内存中分别以什么样的⼆
进制存储的呢?如果我们每个⼈⾃⼰给这些字符中的每个字符编⼀个⼆进制序列,这个叫做编码,为
了⽅便⼤家相互通信,不造成混乱,后来美国国家标准学会(ANSI)出台了⼀个标准ASCII编码,C
语⾔中的字符就遵循了ASCII编码的⽅式。
ASCII码表
参考:https://zh.cppreference.com/w/cpp/language/ascii
我们不需要记住所有的ASCII码表中的数字,使⽤时查看就可以,不过我们最好能掌握⼏组特殊的数
据:
• 字符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个字符是不可打印字符,⽆法打印在屏幕上观察
实践检验更深刻
单个字符的打印可以使⽤%c来指定格式:
1 #include <stdio.h>
2
3 int main()
4 {
5 printf("%c\n", 'Q');
6 printf("%c\n", 81);//这⾥的81是字符Q的ASCII码值,也是可以正常打印的
7 return 0;
8 }
可打印字符展示:
1 #include<stdio,h>
2
3 int main()
4 {
5 int i = 0;
6 for(i = 32; i <= 127; i++)
7 {
8 printf("%c",i);
9 if (i % 16 == 15)
10 printf("\n");
11 }
12 return 0;
13 }
10.字符串和\0
C语⾔中如何表⽰字符串呢?使⽤双引号括起来的⼀串字符就被称为字符串,如:“abcdef”,就是一个字符串。
字符串的打印格式可以使⽤%s
来指定,也可以直接打印如下:
1 #include<stdio,h>
2
3 int main()
4 {
5 printf("%s\n", "hello C");
6 printf("hello c");
7 return 0;
8 }
C语⾔字符串中⼀个特殊的知识,就是在字符串的末尾隐藏放着⼀个\0
字符,这个\0
字符是字符串的结束标志。(可在VS2022的监视窗口看见)
对于字符串"abcdef",我们实际上看到了6个字符:a,b,c,d,e,f,但是实际上在末尾还隐藏⼀个
转义字符,\0
是字符串的结束标志。所以我们在使⽤库函数strlen()
计算字符串⻓度的时候,遇到printf()
打印字符串或者\0
的时候就⾃动停⽌了。
C语言可以把一个字符串放在一个字符数字中,用下面代码验证一下\0
的功能。
1 #include<stdio,h>
2
3 int main()
4 {
5 char arr1[] = {'a', 'b', 'c'};//arr1数组中存放3个字符
6 char arr2[] = "abc"; //arr2数组中存放字符串
7 printf("%s\n", arr1);
8 printf("%s\n", arr2);
9
10 return 0;
11 }
这样的代码,我调试的时候,观察⼀下arr1
和arr2
的内容:
运行结果:
我们可以看到,arr1
字符数组在打印的时候,打印了a
、b
、c
后还打印了⼀些随机值,这就是因为arr1
在末尾的地⽅没有\0
字符作为结束标志,在打印的时候没有停⽌。
但是arr2
的打印就是完全正常的,就是因为arr2
数组是使⽤字符串常量初始化的,数组中有作为技术标志,打印可以正常停⽌。
如果我们在arr1数组中单独放⼀个’\0’字符会怎么样呢?
1 #include<stdio,h>
2
3 int main()
4 {
5 char arr1[] = {'a', 'b', 'c','\0'};/
6 char arr2[] = "abc";
7 printf("%s\n", arr1);
8 printf("%s\n", arr2);
9 printf("%s\n", "abc\0def");
10 return 0;
11 }
看到三次打印的结果是⼀样的了,都是打印到\0
的时候就停⽌了,那从上述的例⼦我们确实能够观察到\0
的作⽤和重要性的。
11.转义字符
我们可以看到修改的前后代码输出的结果,截然不同的,那这是为什么呢?
这就是转义字符的问题,\n
是一个转义字符表示换行的意思,我们可以简单的理解为\
让n
的意思发生了转变,n
本来是一个普通的字符,被\
转义为换行的意思。
C语言中像这样的转义字符还有一些,具体如下:
\?
:在书写连续多个问号时使用,防止他们被解析成三字母词,在新的编译器上没法验证了。
\'
:用于表示字符常量
\"
:用于表示一个字符串内部的双引号
\
:用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a
:警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生。
\b
:退格键,光标回退一个字符,但不删除字符。
\f
:换页符,光标移到下一页。在现代系统上,这已经反映不出来了,行为改成类似于\v。
\n
:换行符。
\r
:回车符,光标移到同一行的开头。
\t
:制表符,光标移到下一个水平制表位,通常是下一个4/8的倍数。
\v
:垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列。
下面2种转义字符可以理解为:字符的8进制或者16进制表示形式
\ddd
:ddd表示1~3个八进制的数字。如:\130表示字符X
\xdd
:d d表示2个十六进制数字。如:x30 表示字符0
\0
:null字符,代表没有内容,\0
就是\ddd
这类转义字符的一种,用于字符串的结束标志,其ASCII码值是0.
转义字符参考:https://zh.cppreference.com/w/c/language/escape
12.语句和语句分类
- 空语句
- 表达式语句
- 函数调用语句
- 复合语句
- 控制语句
12.1 空语句
空语句是最简单的,⼀个分号就是⼀条语句,是空语句。
1 #include<stdio,h>
2 int main()
3 {
4 ;//空语句
5 return 0;
6 }
空语句,⼀般出现的地⽅是:这⾥需要⼀条语句,但是这个语句不需要做任何事,就可以写⼀个空语句。
12.2 表达式语句
表达式语句就是在表达式的后边加上分号。如下所⽰:
1 #include<stdio,h>
2 int main()
3 {
4 int a =20;
6 int b =13;
7 b = a + 5;//表达式语句
8 return 0;
9 }
12.3 函数调用语句
函数调⽤的时候,也会加上分号,就是函数调⽤语句。
1 #include<stdio,h>
2 int Add(int x, int y)
3 {
4 return x+y;
5 }
6 int main()
7 {
8 printf("hehe\n");
9 int ret = Add(2,3);//函数调用语句
10 return 0;//函数调用语句
11 }
12.4 复合语句
复合语句其实就是代码块,成对括号中的代码就构成⼀个代码块,也被称为复合语句。
1 #include<stdio,h>
2 void print(int arr[],int sz)//函数的大括号中的代码也构成复合语句
3 {
4 int i = 0;
5 for(i = 0; i<sz; i++)
6 {
7 printf("%d",arr[i]);
8 }
9 }
10 int main()
11 {
12 int i = 0;
13 int arr[10] = [0];
14 for(i = 0; i<10; i++)//for循环的循环体的大括号中的就是复合语句
15 {
16 arr[i] = 10-i;
17 printf("%d\n",arr[i]);
18 }
19 return 0;
20 }
12.5 控制语句
控制语句⽤于控制程序的执⾏流程,以实现程序的各种结构⽅式(C语⾔⽀持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语⾔有九种控制语句。
可分成以下三类:
-
- 条件判断语句也叫分⽀语句:if语句、switch语句;
-
- 循环执行语句:dowhile语句、while语句、for语句;
-
- 转向语句:break语句、goto语句、continue语句、return语句。
13.注释是什么?为什么写注释?
注释是帮助程序员自己理解代码,或者让其他程序员能看懂的语句。
注释有两种形式:
13.1 /**/的形式
第⼀种⽅法是将注释放在/*...*/
之间,内部可以分行。
1 /* 注释*/
2
3 /*
4 这是⼀⾏注释
5 */
这种注释可以插在行内。
1 int fopen(char* s/*file name */, int mode);
上⾯⽰例中,/* file name */
⽤来对函数参数进⾏说明,跟在它后⾯的代码依然会有效执⾏。这种注释⼀定不能忘记写结束符号*/
,否则很容易导致错误。
1 printf("a "); /* 注释⼀
2 printf("b ");
3 printf("c "); /* 注释⼆*/
4 printf("d ");
上⾯⽰例的原意是,第⼀⾏和第三⾏代码的尾部,有两个注释。
但是,第⼀⾏注释忘记写结束符号,导致注释⼀延续到第三⾏结束。/**/
的这个注释也不⽀持嵌套注释,/*
开始注释后,遇到第⼀个*/
就认为注释结束了。
1 /*
2 printf("a ");
3 printf("b ");
4 printf("c "); /* 注释⼆*/
5 printf("d ");
6 /*
13.2 //的形式
第⼆种写法是将注释放在双斜杠//
后⾯,从双斜杠到⾏尾都属于注释。这种注释只能是单⾏,可以放在⾏⾸,也可以放在⼀⾏语句的结尾。这是C99标准新增的语法。
1 //这是一行注释
2
3 int x = 1;//这也是注释
13.3 注释会被替换
编译时,注释会被替换成⼀个空格,所以min/*这里是注释*/Value
会变成min Value
,而不是minValue
。