【C语言】MOOC翁恺老师-入门-C的介绍与发展史-2
一、程序设计与语言
1. 计算机和编程语言
-
请求人和计算机做事的区别
- 请求人:What to do ,人会思考一件事的处理步骤
- 请求计算机:How to do ,计算机只能一步步告知如何做
-
编程语言
- 编程语言不是用来和计算机交谈,而是描述要求它如何做事情的步骤
-
算法
- 要让计算机做计算,就需要找出计算的步骤,然后用编程语言写出来
- 计算机做的所有事情都叫做计算,计算的步骤就是算法
-
计算机的计算思维
- 计算机的计算往往是最笨的,只能通过枚举和循环一个个试错,最终得到正确答案,所以当正确答案是以万,百万级别的,得出正确结果的效率便会很慢,尽管计算机的处理十分快。
- 因此,经过数几十年的研究和总结,我们针对各种问题都有合适的算法来进行解决。这些合适的算法有一个共同点,就是尽量缩小计算机试错的范围。
-
程序的执行
- 解释:会将代码一句一句直接执行,在执行期,动态将代码逐句解释为机器代码
- 编译:像翻译一样,先将代码编译为机器代码,再加以执行。
-
问题:
-
计算机里的CPU可以直接运行人类编写的程序吗?为什么说编程语言不是和计算机交谈的语言?
答:计算机能运行的是机器语言,但是编写程序用的是高级语言,不能直接运行。编程语言不是用来和计算机交谈,而是描述要求它如何做事情的步骤。
-
有的编程语言,源代码经过编译后形成目标代码,但是这样的目标代码不能直接在CPU上执行,而是需要由一个仿真器程序来解释执行。这样的执行方式是编译的还是解释的?
答:仿真器可以使一台计算机系统在行为上类似于另一台计算机系统,问题中仿真器进行解释执行,即将代码一句句执行,并非编译为机器代码再执行,所以这种执行方式应该为解释执行。
-
2. C语言
-
C语言的发展史
- C语言是从B语言发展而来的,B语言是从BCPL发展而来
- BCPL和B语言都支持指针间接方式,所以C语言也支持,指针是C的灵魂
-
C语言的应用
- 操作系统、嵌入式系统、驱动程序、底层驱动
- 因为C语言的执行速度和汇编语言差不多,很快。因此可以发现有些程序员虽然在企业开发的时候用Python,Java等面向对象语言,但在处理某个需要反映及时的模块时候会用C编写,就是因为其执行速度快。
-
C编译的发展史
-
Unix操作系统是与C一起成长起来的,本身就包含着C的编译器
cc
,像现在的MacOS操作系统其核心就是Unix,可以直接运行.c
文件。但我们现在也有Window的操作系统,那后面是怎么处理的?微软开发了编译器mscc
。 -
后面有一家机构GUN出了一个编译器
gcc
跑在Unix和Linux等操作系统上,打败了各个产家做的cc
,包括mscc
。但是在个人电脑的领域上,Window是占据市场最多的,怎么办呢?有人就像把gcc
搬到Window上面,所以就造成现在是以gcc
编译器为准的。 -
要把
gcc
移植到Window操作系统上,那么就需要WindowOS提供API(应用程序接口)给gcc
,这是第一个需求问题。第二个需求问题就是.c
文件变成可执行文件.exe
,其不是仅依赖cc
编译就可以的,还要有库文件lib
里面的库函数一起作用才可以。所以lib
也需要WindowOS提供API才行。 -
在做上面两个需求的时候分化了两个做法,一个做法叫cygwin,它给了WindowOS一个Unixlib的接口,
.c
文件经过gcc
和Unixlib
的共同作用下就变成了可以在WindowOS上执行的Unix应用。另一种做法叫minGW,它仅仅把Unixlib换成Winlib而已,其它都一样的,但是现在已经很久没有更新了。 -
到了现在又有很多种选择,但是本质上还是上面两种做法,只是不同的机构开发而已。现在我们选择TDM-GCC,其安装简单,属于minGW做法。
-
3. 第一个程序
-
hello world
# include <stdio.h> int main() { printf("hello world\n"); return 0; }
所有的程序都要有这一段
-
做点计算
# include <stdio.h> int main() { printf("%d\n", 23+43); printf("23+43=%d\n", 23+43); return 0; }
%d
说明后面有一个整数要输出在这个位置上,%d
是一个格式占位符 -
C编译器的缺点:无法很好的定位错误在哪
-
问题:
-
常听到有人说他学的是Visual C,有人学的是Turbo C,不是我们学的什么Dev C,是他们的比我们的高级吗?还有GCC到底是什么?
答:Visual C、Turbo C和DEV-C++都是C语言的IDE,即集成开发环境,没什么实质上的区别,只是开发商不一样,UI界面不一样。GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)
-
为什么看到有的书上的main()是void main(),而我们课件上是int main()?还有main()里面那句return 0;是必须的吗?
答:
void main
和int main
的区别就是有无返回值。在int main
可以出现非 int 类型的东西。在写代码时,一个函数要么有返回值。要么没有返回值,没有返回值就用void来表示。main函数同样的,在没有返回值时加个void 。有的编译器必须main要有返回值 int,那就写成int main
。void代表不需要返回值,也就是不需要使用return。
-