Note/青空笔记/C语言程序设计笔记/C语言(一).md

255 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

![image-20220531094944782](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rcjsrnpyj21g40i642g.jpg)
**温馨提示:**所有的笔记需要使用Typora软件打开在视频下方简介中直接获取纯个人录制不用加什么公众号这些各位小伙伴直接网盘自取吧。
# 计算机思维导论
计算机自1946年问世以来几乎改变了整个世界。
现在我们可以通过电脑来做很多事情比如我们常常听到的什么人工智能、电子竞技、大数据等等都和计算机息息相关包括我们现在的手机、平板等智能设备也是计算机转变而来的。各位可以看看最顶上的这张图片如果你在小时候接触过计算机那么一定对这张图片照片拍摄于1996年在美国加利福尼亚州加利福尼亚州的锁诺玛县印象深刻这张壁纸作为WindowsXP系统的默认壁纸曾经展示在千家万户的电脑屏幕上。
也许你没有接触过计算机也许你唯一接触计算机就是用来打游戏也有可能你曾经捣鼓过计算机在学习C语言之前先让我们来了解一下计算机的世界。
## 计算机的世界
计算机虽然名字听着很高级,不过它也是由一个个简单电路组成的。
![image-20220531100709841](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rd1x1rtgj21dy0cw74r.jpg)
这是我们在初中就学习过的电路图,不过这种电路太过简单,只能完成一些很基础的的操作,比如点亮小灯泡等。
很明显想要实现计算机怎么高级的运算机器,肯定是做不到的,这时我们就需要引入更加强大的数字电路了。
> 用数字信号完成对数字量进行[算术运算](https://baike.baidu.com/item/算术运算/3118202)和[逻辑运算](https://baike.baidu.com/item/逻辑运算/7224729)的电路称为数字电路,或数字系统。由于它具有逻辑运算和逻辑处理功能,所以又称数字逻辑电路。现代的数字电路由半导体工艺制成的若干数字集成器件构造而成。逻辑门是数字逻辑电路的[基本单元](https://baike.baidu.com/item/基本单元/5246264)。
>
> 计算机专业一般会在大一开放《数字电路》这门课程,会对计算机底层的数字电路实现原理进行详细介绍。
数字电路引入了逻辑判断,我们来看看简单的数字电路:
![image-20220531102337270](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rdj1916aj21iq0dygm4.jpg)
数字电路中用电压的高低来区分出两种信号低电压表示0高电压表示1由于只能通过这种方式表示出两种类型的信号所以计算机采用的是二进制。
> [二进制](https://baike.baidu.com/item/二进制/361457)是计算技术中广泛采用的一种[数制](https://baike.baidu.com/item/数制/217113)。二进制数据是用0和1两个数码来表示的数。它的[基数](https://baike.baidu.com/item/基数/4260)为2进位规则是“逢二进一”借位规则是“借一当二”。
>
> 比如我们一般采用的都是十进制表示比如9再继续加1的话就需要进位了变成10在二进制中因为只有0和1所以当1继续加1时就需要进位了就变成10了注意这不是十读成一零就行了
当然,仅仅有两种信号还不够,我们还需要逻辑门来辅助我们完成更多的计算,最基本的逻辑关系是与、或、非,而逻辑门就有相应的是[与门](https://baike.baidu.com/item/与门)、[或门](https://baike.baidu.com/item/或门)和[非门](https://baike.baidu.com/item/非门),可以用电阻、电容、二极管、三极管等分立原件构成(具体咋构成的咱这里就不说了)
比如与操作因为只有两种类型我们一般将1表示为真0表示为假与操作&表示)要求两个数参与进来,比如:
* 1 & 1 = 1 必须两边都是真,结果才为真。
* 1 & 0 = 0 两边任意一个或者都不是真,结果为假。
或运算(用 | 表示):
* 1 | 0 = 1 两边只要有一个为真,结果就为真
* 0 | 0 = 0 两边同时为假,结果才是假
非运算实际上就是取反操作(可以是 ! 表示)
* !1 = 0
* !0 = 1 非运算会将真变成假,假变成真
有了这些运算之后,我们的电路不仅仅可以实现计算,也可以实现各种各样的逻辑判断,最终才能发展成我们的计算机。
前面我们大概介绍一下计算机的底层操作原理,接着我们来看看计算机的基本组成。
![image-20220531105143154](https://tva1.sinaimg.cn/large/e6c9d24ely1h2reca0cgoj20x60b40uu.jpg)
相信各位熟知的计算机都是一个屏幕+一个主机的形式,然后配上我们的键盘鼠标,就可以开始使用了,但是实际上标准的计算机结构并没有这么简单,我们来看看:
![image-20220531105407595](https://tva1.sinaimg.cn/large/e6c9d24ely1h2reersjdmj21k20fqdhl.jpg)
我们电脑最核心的部件当属CPU因为几乎所有的运算都是依靠CPU进行各种各样的计算电路已经在CPU中安排好了我们只需要发送对应的指令就可以进行对应的运算它就像我们人的大脑一样有了大脑才能进行思考。不过光有大脑还不行还要有一些其他的部分来辅助工作比如我们想向电脑里面打字那么就需要连接一个键盘才能输入我们想要点击桌面上的图标那么就需要一个鼠标来操作光标这些都是输入设备。我们的电脑开机之后显示器上会显示出画面实际上显示器就是输出设备。
当然除了这些内容之外我们的电脑还需要内存来保存运行时的一些数据以及外存来保存文件比如硬盘等。我们常说的iPhone13 512G这个512G并不是指的内存而是指的外存准确的说是用于存放文件硬盘大小而真正的内存是我们常说的4G/6G/8G运行内存内存的速度远高于外存的速度所以1G内存的价格远超1G硬盘的价格。
![image-20220531132920027](https://tva1.sinaimg.cn/large/e6c9d24ely1h2riw9u06uj21bs0b4jso.jpg)
计算机包括五大部件:运算器、控制器、存储器、输入和输出设备。有了这一套完整的硬件环境,我们的电脑才算是有了一个完整的身体。
**问题:**我们上面提到的这些硬件设备哪些是属于外设?
## 操作系统概述
前面我们了解了一下计算机的大致原理和组成结构,但是光有这一套硬件可不行,如何让这一套硬件按照我们想要的方式运作起来,也是非常重要的,这时我们就需要介绍操作系统了。
> 操作系统operating system简称OS是管理[计算机硬件](https://baike.baidu.com/item/计算机硬件/5459592)与[软件](https://baike.baidu.com/item/软件/12053)资源的[计算机程序](https://baike.baidu.com/item/计算机程序/3220205)。操作系统需要处理如管理与[配置](https://baike.baidu.com/item/配置/2394679)[内存](https://baike.baidu.com/item/内存/103614)、决定[系统资源](https://baike.baidu.com/item/系统资源/974435)供需的优先次序、控制[输入设备](https://baike.baidu.com/item/输入设备/10823368)与[输出设备](https://baike.baidu.com/item/输出设备/10823333)、操作网络与管理[文件系统](https://baike.baidu.com/item/文件系统/4827215)等基本事务。操作系统也提供一个让用户与系统[交互](https://baike.baidu.com/item/交互/6964417)操作的界面。
>
> 一般在计算机专业大二,会开放《操作系统》课程,会详细讲解操作系统的底层运作机制和调度。
一般我们电脑上都安装了Windows操作系统苹果笔记本安装的是MacOS操作系统现在主流的电脑都已经预装Windows11了
![image-20220531135531352](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rjnis7lkj21ew0e041a.jpg)
有了操作系统,我们的电脑才能真正运行起来,我们就可以轻松地通过键盘和鼠标来操作电脑了。
不过操作系统最开始并不是图形化界面它类似于Windows中的命令提示符
![image-20220531142155616](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rkezow9dj21v60ew40f.jpg)
![image-20220531142617124](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rkjitqqnj21kc08475e.jpg)
没有什么图标这些概念,只有一个简简单单的黑框让我们进行操作,通过输入命令来进行一些简单的使用,程序的运行结果也会在黑框框(命令行)中打印出来,不过虽然仅仅是一个黑框,但是能运行的程序可是非常非常多的,只需要运行我们编写好的程序,就能完成各种各样复杂的计算任务,并且计算机的计算速度远超我们的人脑。
> 中国超级计算机系统天河二号计算速度达到每秒5.49亿亿次。
当然除了我们常见的Windows和MacOS系统之外还有我们以后需要经常打交道的Linux操作系统这种操作系统是开源的意思是所有的人都可以拿到源代码进行修改于是就出现了很多发行版
![image-20220531142844465](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rkm3bo7sj21gk0b4dh3.jpg)
这些发行版有带图形化界面的也有不带图形化界面的不带图形化界面的Linux将是我们以后学习的重点。
不同操作系统之间的软件并不是通用的比如Windows下我们的软件一般是.exe后缀名称而MacOS下则不是并且也无法直接运行.exe文件这是因为不同操作系统的具体实现会存在一些不同程序编译我们之后会介绍到之后的格式也会不同所以是无法做到软件通用的。
正是因为有了操作系统才能够组织我们计算机的底层硬件包括CPU、内存、输入输出设备等进行有序工作没有操作系统电脑就如同一堆废铁只有躯壳没有灵魂。
## 计算机编程语言
现在我们大致了解了我们的电脑的运作原理,实际上是一套完整的硬件+一个成形的操作系统共同存在的。接着我们就可以开始了解一下计算机的编程语言了。我们前面介绍的操作系统也是由编程语言写出来的,操作系统本身也算是一个软件。
![image-20220531144405958](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rl228014j21eq0a2gnf.jpg)
那么操作系统是如何让底层硬件进行工作的呢实际上就是通过向CPU发送指令来完成的。
> 计算机指令就是指挥机器工作的指示和命令程序就是一系列按一定顺序排列的指令执行程序的过程就是计算机的工作过程。指令集就是CPU中用来计算和控制计算机系统的一套指令的集合而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。而指令集的先进与否也关系到CPU的性能发挥它也是CPU性能体现的一个重要标志。
我们电脑中的CPU有多种多样的不同的CPU之间可能也会存在不同的架构比如现在最常用的是x86架构还有我们手机平板这样的移动设备使用的arm架构不同的架构指令集也会有不同。
我们知道计算机底层硬件都是采用的0和1这样的二进制表示所以指令也是一样的比如这里随便写的
* 000001 - 代表开机
* 000010 - 代表关机
* 000011 - 代表进行加法运算
当我们通过电路发送给CPU这样的二进制指令CPU就能够根据我们的指令执行对应的任务而我们编写的程序保存在硬盘中也是这样的二进制形式我们只需要将这些指令组织好按照我们的思路一条一条执行对应的命令就能够让计算机计算任何我们需要的内容了这其实就是机器语言。
不过随着时代的进步指令集越来越大CPU支持的运算类型也越来越多这样的纯二进制编写实在是太累了并且越来越多的命令我们根本记不住于是就有了汇编语言。汇编语言将这些二进制的操作码通过助记符来替换
* MOV 传送字或字节。
* MOVSX 先符号扩展,再传送。
* MOVZX 先零扩展,再传送。
* PUSH 把字压入堆栈。
把这些原有的二进制命令通过一个单词来代替,这样是不是就好记多了,在程序编写完成后,我们只需要最后将这些单词转换回二进制指令就可以了,这也是早期出现的低级编程语言。
![image-20220531150346899](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rlmjqp3dj217e09agmz.jpg)
不过虽然通过这些助记符就能够很轻松地记住命令但是还是不够方便因为可能我们的程序需要完成一个很庞大的任务但是如果还是这样一条一条指令进行编写是不是太慢了点有时候可能做一个简单的计算都需要好几条指令来完成。于是高级编程语言——C语言终于诞生了。
> C语言诞生于美国的[贝尔实验室](https://baike.baidu.com/item/贝尔实验室/686816),由[丹尼斯·里奇](https://baike.baidu.com/item/丹尼斯·里奇/7267171)Dennis MacAlistair Ritchie以肯尼斯·蓝·汤普森Kenneth Lane Thompson设计的[B语言](https://baike.baidu.com/item/B语言/1845842)为基础发展而来在它的主体设计完成后汤普森和里奇用它完全重写了UNIX操作系统且随着UNIX操作系统的发展C语言也得到了不断的完善。
高级语言不同于低级语言低级语言的主要操作对象是指令本身而高级语言却更加符合我们人脑的认知更像是通过我们人的思维去告诉计算机你需要做什么包括语法也会更加的简单易懂。下面是一段简单的C语言代码
```c
int main() {
int a = 10; //定义一个a等于10
int b = 10; //定义一个b等于10
int c = a + b; //语义非常明确c就是a加上b计算出来的结果。
return 0;
}
```
不过现在看不懂没关系,我们后面慢慢学。
C语言虽然支持按照我们更容易理解的方式去进行编程但是最后还是会编译成汇编指令最后变成计算机可以直接执行的指令不过具体的编译过程我们不需要再关心了我们只需要去写就可以了而对我们代码进行编译的东西称为编译器。
![image-20220603123928430](https://tva1.sinaimg.cn/large/e6c9d24egy1h2uzn81nwsj21qk07mdhd.jpg)
当然除了C语言之外还有很多其他的高级语言比如Java、Python、C#、PHP等等相比其他编程语言C算是比较古老的一种了但是时隔多年直至今日其他编程语言也依然无法撼动它的王者地位
![image-20220531151304124](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rlw7fvhmj20xo0b0wf4.jpg)
可以看到在2021年9月依然排在编程语言排行榜的**第一名**Python和Java紧随其后可见这门语言是多么的不可撼动很多操作系统、高级编程语言底层实现几乎都是依靠C语言去编写的包括Java的底层也是C/C++实现的所以学习这一门语言对于理工科尤其是计算机专业极为重要学好C语言你甚至可以融汇贯通到其他语言学起来也会轻松很多。
那么从下节课开始,我们就先做好一些环境上的准备。
## C语言开发环境部署
完成开发环境部署之后我们就可以使用C语言来将一句话输出到控制台了成功编译运行下面的简单程序
```c
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
```
首先我们既然要将我们编写的C语言代码进行编译那么肯定得找到一个合适的编译器才行现代的集成开发环境IDE一般都包含了这些编译器所以我们不需要进行单独的安装。
我们只需要找一个集成开发环境去安装就行了,目前功能比较完善的集成开发环境有:
* Codeblocks支持Windows、Linux、MacOS操作系统
* Visual Studio支持Windows、MacOS操作系统
* CLion支持Windows、Linux、MacOS操作系统
这里我们就使用CLion作为我们的开发工具使用这个IDE是收费的但是学生可以申请免费使用别担心大学四年肯定是够你用了选这个是考虑到后面同学们可能会继续学习JavaJava语言的推荐IDE也是同一个公司的产品界面都长得差不多当然如果你想要使用其他的开发工具也可以但是这里我们就不演示了。
首先前往官网下载:[CLion: A Cross-Platform IDE for C and C++ by JetBrains](https://www.jetbrains.com/clion/)
![image-20220531155158399](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rn0oo80lj22h00eudia.jpg)
下载完成后我们直接点击安装:
![image-20220531160109168](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rna8jfzdj21wa0lg438.jpg)
如果你不是很熟悉建议直接点Next安装到C盘默认路径不要去修改当然如果确实C盘没有空间那可以自行修改为其他路径但是注意最好路径中不要出现中文。
![image-20220531160325932](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rncm5g59j220k0l4q7u.jpg)
勾选一下创建快捷方式然后继续点Next等待安装就行了
![image-20220531160400589](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rnd7qj7mj22080l67b2.jpg)
安装完成后,我们可以直接打开:
![image-20220531161024539](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rnjvf3k1j227w0r079b.jpg)
这里会提示我们激活点击按钮去官网注册一个账号。注册完成后推荐去申请一下学生授权因为试用只有30天[Jetbrains学生授权获取指南 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/378185042)
![image-20220531161215214](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rnltppqfj22c40segr3.jpg)
这里我们点击开始试用然后就可以点击Continue了现在成功来到主界面
![image-20220531161354913](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rnnis1prj22020u00xg.jpg)
由于是英文,使用不太方便,所以我们安装一下中文插件:
![image-20220531161457379](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rnom1mcvj223k0u0k1k.jpg)
现在我们就成功安装好CLion集成开发环境了。
![image-20220531161549721](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rnpj7nshj222r0u0wjs.jpg)
现在我们来创建我们的第一个C语言项目我们的程序是以一个项目的形式进行管理的这里知道怎么创建就行了
![image-20220531161637209](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rnqck8fyj22450u0tf6.jpg)
这里选择C可执行文件然后项目的保存位置可以自行修改配置完成后点击创建
![image-20220531162129788](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rnveombnj21kx0u00vt.jpg)
可以看到在创建之后会自动为我们生成一段示例代码而之后我们要编写的代码都在生成的main.c中进行编写除了这个文件其他的全部不要去修改也不用管是什么意思后面我们会慢慢介绍。
接着我们需要配置一下工具链选择捆绑的MinGW如果已经有了就不需要配置了
![image-20220531163655149](https://tva1.sinaimg.cn/large/e6c9d24ely1h2robghz53j21kq0u0tdo.jpg)
那么这段示例代码有了,我们如何编译运行呢?
![image-20220531162447514](https://tva1.sinaimg.cn/large/e6c9d24ely1h2rnyucqxmj21kv0u00wb.jpg)
我们可以点击代码旁边的绿色三角形符号或是右上角的绿色三角形就可以直接编译运行我们的代码了。运行的结果是在控制台输出一个“HelloWorld当然我们也可以直接运行编译出来的可执行文件
![image-20220531162638883](https://tva1.sinaimg.cn/large/e6c9d24ely1h2ro0rgqnaj21u20e4di5.jpg)
我们可以看到,这里生成了一个`项目名称.exe`文件这种就是Windows环境下可以直接运行的应用程序我们可以打开这个文件夹直接使用cmd来运行
![image-20220531162824734](https://tva1.sinaimg.cn/large/e6c9d24ely1h2ro2lc6rxj218404qt9n.jpg)
运行出来的效果是一样的,这种程序实际上就是最原始的命令行程序,输入和输出都是在这种黑框框中进行的,而我们的主要学习目标也是这种命令行程序。
这样我们就配置好了开发环境,然后就不要去动其他的东西了,一般新手最容易遇到一些奇奇怪怪的问题。