第1章 计算机与C语言

1.1 计算机与编程语言

1.1.1 计算机如何工作?编程是什么?

计算机是为人类服务的,那么我们拿餐厅的服务员来做一下比较。比如说你想要一杯水,你可以和服务员说“给我一杯水”

但对计算机就不一样了,你和它说“给我一杯水”,它根本不会搭理你,不是故意无视你,而是它真的不知道怎么做呀。计算机需要程序员输入一条条指令才会动,所以聪明的不是计算机,虽然凭借内部的芯片,让计算机拥有速度可以执行多项任务的智能,但一切智慧的源头都是来自程序员。所以每当程序员要让计算机执行任务时,都必须要给出十分具体,清晰的指令。

对人可以说“what to do”;但对计算机就得是“how to do”了

**编程(Programming)**是编定程序的中文简称,就是让计算机代码解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。

程序(program)

  • 定义:一组指示计算机或其他具有消息处理能力设备每一步动作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。
  • 程序是如何解决问题的东西
  • 指特定的一系列动作、行动或操作,或一系列指令的集合
  • 程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。为实现预期目的而进行操作的一系列语句和指令。

程序设计(programming)

  • 程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。程序设计过程应当包括分析、设计、编码、测试、排错等不同阶段。专业的程序设计人员常被称为程序员。

算法(Algorithm)

  • 如果想让计算机做计算任务,那么就需要将程序员的想法,思维过程用编程语言将步骤一步一步列出来
  • 这些步骤就是算法
  • 计算机做的都是计算
  • 算法是为了解决某个问题的步骤和方法,有多种算法可以解决同一个问题,只不过就看它们的复杂度,选取最优的算法

编程语言:不是与计算机用来和计算机沟通的,而是发出指令的,程序员将自己的思维过程用编程语言列出来,让计算机执行计算,去解决问题

程序的执行有两种方法:解释与编译

  • 解释(Python):另一个程序试图去理解你的程序

    • 解释性语言拥有特殊的计算能力,容易修改,执行效率会低一点
  • 编译(C语言):另一个程序会翻译你的程序去机器语言,变成可直接执行文件,相当于一个翻译器

    • 编译性语言效率更快,并且有确定的运算
image-20201225195737961

编译流程

加深理解:

  • 解释性语言就好像吃火锅,边做边吃,编译性语言就是全部菜上来再开吃,因为火锅要边煮边吃,所以效率会低一些

  • 但语言本无解释与编译之分,仅凭个人喜好安排,你要是想用编译器就用,想用解释器就用,都是凭靠自己的习惯与喜好

补充知识点

程序设计步骤

分析问题

  • 对于接受的任务要进行认真的分析,研究所给定的条件,分析最后应达到的目标,找出解决问题的规律,选择解题的方法,完成实际问题。

设计算法

  • 即设计出解题的方法和具体步骤。

编写程序

  • 将算法翻译成计算机程序设计语言,对源程序进行编辑、编译和连接。

运行程序,分析结果

  • 运行可执行程序,得到运行结果。能得到运行结果并不意味着程序正确,要对结果进行分析,看它是否合理。不合理要对程序进行调试,即通过上机发现和排除程序中的故障的过程。

编写程序文档

  • 许多程序是提供给别人使用的,如同正式的产品应当提供产品说明书一样,正式提供给用户使用的程序,必须向用户提供程序说明书。内容应包括:程序名称、程序功能、运行环境、程序的装入和启动、需要输入的数据,以及使用注意事项等。

1.1.2 计算机的思维是什么?

计算机是最擅长做重复的东西——枚举法

比如一道方程:2x+6=12,人类会很快就能算出来,但计算机不同呀,它会这样算

  • 2×1+6≠12;2×2+6≠12

  • 一直重复,直到得出正确答案

  • 如果程序员加上一个约束条件,比如说给出一个范围给它,它就会更高效

1.2 C语言

1.2.1 为什么我们选择C语言?

程序设计语言非常多,而C语言在市场份额中占据非常大,将近17%!可以在TIOBE官网中查询

  • 市场份额:市场份额亦称“市场占有率”。指某企业某一产品(或品类)的销售量(或销售额)在市场同类产品(或品类)中所占比重。反映企业在市场上的地位。通常市场份额越高,竞争力越强。
image-20201225201730246

一,Java与C语言

(1)为什么java会不稳定呢?

  • Java不稳定的主要因素还是因为有更好的其它语言可以代替它

(2)且C语言稳定的因素是它能够解决特定的一些问题,而这些问题是其它语言很难做到的,例如操作系统,嵌入式,这些除了C语言就没有其它选择了,其它则有时候使用C++

二,其它语言

(1)现代的编程语言在语法中差异很小

  • 现代的新出现的所有编程语言都是C-like语言,因为它们都和C语言十分接近,如变量怎样定义,函数等
  • 而上世纪60,70年代就不同了,因为当时的语言差异非常大。

(2)语言的能力/适用领域主要是由它的库与传统所决定的

  • 库:因为有些编程语言它的库中或许有些函数或者类可以用于解决这个问题
  • 传统:因为一个问题或许它在传统里有个专门的语言可以解决,如果这种问题要写的软件比较多,则这门语言就应用的多,那么市场份额也就越大

嵌入式:我们都知道,计算机系统可以处理各种数据、管理各种数据,我们这里所说的数据是包括文字、数字、图片以及各种指令。计算机系统就象人的大脑,记忆我们经历过的各种信息,帮我们分析各种信息,还可以控制指挥我们的各种行为。我们希望能制造各种有智能的机器,那幺这些机器就需要一套脑系统,这些机器可能很小,如我们使用的数码照相机,我们不能将PC机装进去,也不能照相的时候还抗着PC机,于是就需要给它设计一套小小的可以嵌在里面的脑系统,这个大脑有多聪明,就要看它的软件了。这个嵌在里面的脑系统就是一个嵌入式计算机系统,那幺我们可以这样定义:隐藏在一些更大的系统中,管理控制这些系统,并带有微处理器的专用软硬件系统称为嵌入式计算机系统,通常称为嵌入式系统。

C语言与其它语言

  • C++语言;包括C语言的全部特性
  • Java语言:基于C++语言开发的
  • Perl

1.2.2 C语言的简单历史

一,C语言简介

  • C语言在1969年开发出来
  • C语言由B语言发展过来,B语言由BCPL发展过来,BCPL由Fortran发展过来
  • Fortran是人类历史上第一个高级程序设计语言,于1957年开发
  • BCPL和B都支持指针(C语言的指针也是使得C语言变为重要的东西)间接方式,所以C也支持了
  • C语言还受到了PL/I(非常重要的底层编程语言或系统编程语言,汇编语言,与机器语言非常接近,所以可以做一些像操作系统这样的基础程序,在高级语言中,C语言是最低级的语言)的影响,还和PDP-11的机器有很大关系
  • 1973年3月,第三版的Unix上出现了C语言的编译器(编译C语言程序)
  • 1973年11月,第四版的Unix(system four)发不了,这个版本完全用C语言重新写的

二,C语言版本与发展

(1)C语言K&R版本-经典的C

  • 在C语言的发展历史上最早出现的一个版本是K&R-C
  • 这本书里面提出了一些C语言规范的东西,于是后面的编译器都是按照这样的要求做了
  • 叫经典的C,旧的C,传统C

(2)C语言标准

  • 1989年ANSIC(美国国家标准学会)发布了一个标准—ANSIC C
  • 1990年ISO(国际标准组织)搬着了ANSIC的标准—C89
  • C的标准在1995年与1999年两次更新—C95与C99,现在的标准是C18,是2018年最新发布的

(3)不同版本的差异:

  • 语法上面的一些具体差异
  • 也有能力上的差异,如C99的变量是可以在任意地方去定义的;变量可以有const修饰表明这个变量是不可以被修改的。
  • 所有的编译器都支持C99版

1.2.3 编程软件

一,C语言的应用:

  • 操作系统
  • 驱动程序:
  • 底层驱动:图形引擎,图像处理,声音效果;驱动这个游戏的效果,比如玩游戏时的那个引擎,怎样把这个三维的视频播放给你看
  • 嵌入式系统

这些底下的东西语言是用C语言在写

那么上层的东西,表面的东西呢?如一些网站,展示出来的不是用C语言做的,网站背后用的代码不是C语言写的,但网站的服务器本身是C语言写的操作系统,网站的服务器软件是C语言写的,可是直接在给你提供数据的这些代码不是C语言写的

所以C语言是一门工业型语言

  • 是一些做非常基础性工作的人在用C语言(什么人在用C语言?)
  • 开发效率>学习过程
  • 开发效率>开发乐趣
  • 日常应用程序很少直接用到C语言编写,都是间接式应用到的,比如那个程序是用别的程序设计语言写的,但那个程序的编程软件是用C语言写的。
  • 学习C的过程主要是写练习代码,而非真实软件

二,编译到运行
(1)C语言需要被编译才能运行,所以你需要:

  • 编辑器-将你写的代码写在上面,记录下来,只要是个文本编辑软件就可以了,那也就代表着电脑中的文本编辑器也可以用来当编辑器。
  • 编译器-对你的代码进行转换,变成计算机能懂的东西,也就是一个翻译器,翻译成可执行文件
  • 或者直接采用IDE(集成开发环境)

(2)推荐的编程软件

  • Dev C++
  • 免费
  • 安装简单,便捷,不大
  • 不用建工程(因为它可以只是单一的编译运行C源文件,而其它的必须要建立项目,建立工程等繁琐步骤)

(3)其他选择

  • MS Visual Studio Express(Windows)-缺点:太大了;优点:功能多
  • Xcode(Mac OS X)-基于unix系统的
  • Eclipse-CDT
  • Geany(和MinGW一起)-拥有非常基础的编辑器的功能,在这基础上可以调用外部的一些编译器,但它做的很精细,比如说有语法高亮等功能
  • Sublime(和MinGW一起)
  • vim/emacs(和MinGW一起)

MinGW是Minimalist GNU for Windows的缩写。

  • 最小的GNU版本(里面有GNU的编译器),里面包含着编译器套装(GCC)

完全凭个人喜欢,习惯选择,你也可以使用命令行做编辑器,和编译

DEV C++的编译器是mingw的,所以无需再另行安装mingw了

  • Mingw32

1.2.4 记事本+MinGW+命令行

你也可以使用记事本+MinGW+命令行使用,只需要做好环境设置就可以了

  • 为了在 Windows 上安装 GCC,您需要安装 MinGW。为了安装 MinGW,请访问 MinGW 的主页 www.mingw.org,进入 MinGW 下载页面,下载最新版本的 MinGW 安装程序,命名格式为 MinGW-.exe。

  • 当安装 MinGW 时,您至少要安装 gcc-core、gcc-g++、binutils 和 MinGW runtime,但是一般情况下都会安装更多其他的项。

  • 添加您安装的 MinGW 的 bin 子目录到您的 PATH 环境变量中,这样您就可以在命令行中通过简单的名称来指定这些工具。

  • 当完成安装时,您可以从 Windows 命令行上运行 gcc、g++、ar、ranlib、dlltool 和其他一些 GNU 工具。

流程

  • 第一,用编辑器(或者记事本也可以),写好了后缀名是C的文件

  • 第二,打开cmd,转到C文件所在的目录

  • 第三,输入“gcc 文件名.c”,就可以将其编译成可执行文件了,它的文件名是a.exe

    gcc -o name.exe file.c
    

添加到环境变量后的好处是,可以在命令行使用这些工具了

常用命令行指令

cd 文件夹//用于打开文件夹
cd ..//回到上级目录
md 文件夹名字//新建文件夹
dir 显示目录//显示目录    


Visual Studio2010简体中文版/旗舰版安装教程

  • 我的百度网盘有存

MinGW 是什么?

​ MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境。MinGW 收集了一系列免费的Windows 使用的头文件和库文件;同时整合了GNU ( http://www.gnu.org/ )的工具集,特别是GNU 程序开发工具,如经典gcc, g++, make等。MinGW是完全免费的自由软件,它在Windows平台上模拟了Linux下GCC的开发环境,为C++的跨平台开发提供了良好基础支持,为了在Windows下工作的程序员熟悉Linux下的C++工程组织提供了条件。

轻量级与重量级(在软件架构当中的术语解释)

  • 轻量级是相对于重量级的一种对于组件的评判标准,它用来衡量组件对其环境的依赖程度。
  • 轻与重是根据其组件对环境的依赖程度
  • 如果这个依赖越小,就越轻量;反之就越重量。
  • 误区:常常有人用大小来衡量轻量级与重量级,比如php的框架,因为slim要比Laravel小的多,就认为slim轻量而laravel、zend framwork是重量级的。

1.3 第一个C语言程序与环境设置

1.3.1 线上开发环境

在线IDE:https://www.tutorialspoint.com/codingground.htm

过去在电脑上安装集成开发环境:

  • Windows-Dev C++
  • Mac-Xcode

有些线上IDE有严格的语法标准,例如int Hi(只是声明),而没有初始化,有些IDE不能没有初始化。虽然已经在scanf前已经声明了Hi。但它们只接受有初始化的变量(例如int Hi=0)

int main(int argc, char **argv) {
    printf("Hello, World!\n");
    int i=0;
    scanf("%d", &i);
    printf("%d", i+10);
    return 0;
}

1.3.2 Windows安装编程软件

现在在网上一搜什么软件都有,因为C语言的历史上,有很多人做了它的开发环境,做了编译器。

  • 70年代,80年代出现的语言都这样,不是一家独大。在当时,语言的规范一旦出来,就会有很多人去做它的编译器了。
  • 但近几年出现的语言,它的开发环境,标准只掌握在一些极少的团体当中。好处:只有一个软件,没别的选择,这个软件是怎样就是怎样

C语言过去即使有标准,但不同的编译器厂家,写不同编译器的人,因为他们常常带着自己的一些想法,一些编程习惯,所以造成了很多“方言”

在SourceForge(代码托管网站)安装Dev C++

输出

  • printf("Hello World\n")

  • “”里面的内容叫字符串。屏幕会原封不动的输出

  • \n表示需要在输出的结果后面换一行

暂停

  • 如果你在使用Dev C++ 4.9.9.2
  • system("pause");
  • 让程序运行完成后,窗口还能留下
  • 不是Dev C++ 4.9.9.2就不需要这个了

1.3.3 第一个C程序

关于那个小黑框,因为我们还没涉及到GUI(图形用户界面),我们可以称呼它为命令行,终端,控制台都可以。不过我们大多数还是称呼它为终端。

终端:指用户与机器交互的系统,用户可以在其输入数据,它可以输出返回的结果。(终端(Computer terminal),是一台电脑或者计算机系统,用来让用户输入数据,及显示其计算结果的机器,简而言之就是人类用户与计算机交互的设备。终端有些是全电子的,也有些是机电的。其又名终端机,它与一部独立的电脑不同,但也是电脑组成的部分。)

  • 电脑=主机+终端
  • 终端=输入设备+输出设备

**控制台(console)**是命令行界面的别称。取其字面意义,控制台可泛指用于对系统或软件进行管理的应用程序、硬件。

#include <stdio.h>

int main() {
    printf("Hello World!\n");
    return 0;
}

程序框架

  • 所有的程序都需要这一段
  • 在学函数之前,我们写的代码都只是会在这个框架之中
  • 学函数后,我们会调用函数

程序中的错误

image-20201225205046312

(1)编译的时候发现的错误所在的地方会以红色的底表示出来

(2)具体的错误原因列在下方的窗口里(是英文的)

(3)C的编译器给出的错误提示往往不是那么好“猜”。报错十分的模糊(例如你在n段语句后不加“;”,但它在报错是在n+1行前要你添加上“;”)

不要用中文!!!

  • 中国学生还有一个极其常见的低级错误,就是用了中文输入法来输入程序。那些标点符号,在中文和英文可能看上去相似,但是对于计算机是完全不同的符号,如果你还开了全角标点的话,问题就更严重了
  • 因为计算机只懂的数字,那么所有的信息都必须转换为数字,计算机才能看得懂。或者称之为是编码,颜色必须也得转换为编码,称为颜色编码。有些颜色在人的肉眼里看会非常相似,但对于计算机是完全不一样的颜色,因为编码不一样。
  • 而符号也是如此,在手写的时候,人类分不清英文格式与中文格式的符号,因为及其相似。但计算机就不一样了,对它来说,那两个符号的编码完全不一样。

1.3.4 关于那个0

因为数字0和字母o非常相似,而一开始呢,我们又是手写的程序,然后交给操作员打到打卡机,但这操作员它可不懂这代码,他只会按上面代码操作,所以因为这代码是别人写的,他这操作员不就分不清了吗?这究竟是0还是o呢?

于是说,要么在0那里加个斜线,要么在中间加个点,只要能分清出是0还是o就行了

1.3.5 做点计算

关于除法与乘法的符号与我们手写的不一样,为什么呢?因为当时的打字机没有这些运算符号。于是就用了比较相似的代替着

#include <stdio.h>

int main() {
    printf("%d\n", 23 + 57);
    printf("23+57=%d\n", 23 + 57);
    return 0;
}
赞赏