读完了第一章。这章主要是从整体上介绍了C语言,并不牵扯太多细节,试图给读者一个整体的印象,并能让读者马上写一些不复杂的C程序。这点很重要,作者一开篇就明确指出,"The only way to learn a new programming language is by writing programs in it." 这和当年小强的思路完全不同,我当年学完这门课,考过试,得了80多分,整个过程也没上机认真写几个程序,其他同学也好不到哪去。可以说,我学完C语言,还是不会写程序。在我的印象中,C语言就是一门知识点很多、很容易混淆的课程,要考高分无非是记熟这些知识点,考前再背几个“经典程序”而已。悲哀啊。
作者在教大家用C语言打印出"Hello, world"之后,用一句话概括了C程序的特征:"A C program, whatever its size, consists of functions and variables." 一个C程序,甭管它有多大,都由函数和变量组成。这是对C程序的高度概括,体现了C语言是一门结构化编程语言。C语言的执行就是从main函数开始的一个执行序列。复杂的C程序无非是在执行过程中调用了各种自定义的函数和变量。
在介绍C语言的函数时,作者提到:"A function provides a convenient way to encapsulate some computation, which can then be used without worrying about its implementation. With properly designed functions, it is possible to ignore how a job is done; knowing what is done is sufficient." 从这些话可以看出,设计函数是为了功能抽象。函数作为一个功能块,用户不需要关心它是怎么实现的,只需知道它能干什么就可以使用它。这和以后更高层次的功能抽象的思想是一致的。C语言之后出现的面向对象编程、组件化编程,无不是为了提高功能抽象。
学过类C语言的都知道函数调用时的参数传递分为按值调用和按引用调用。这一点我很清楚,但我从来没有深究为什么要分成这两种。在这本书里作者解释了为什么C语言的函数调用默认是传值:"Call by value is an asset, however, not a liability. It usually leads to more compact programs with fewer extraneous variables, because parameters can be treated as conveniently initialized local variables in the called routine." 可以看出,按值调用的目的是为了方便函数编写者,因为参数可以被当作已经初始化过的局部变量来使用,从而使程序更简洁。
最后,还有几点细节值得注意:
- Argument和parameter的区别。Argument通常指实参,而parameter通常指形参。
- 如果算术运算符的两个操作数都是整数,则按整数运算来进行;如果一个是整数,另一个是浮点数,则先把整数转换成浮点数再进行运算。
- 如何从键盘上生成EOF(end of file)。在UNIX下通常是Ctrl+D,在DOS/WINDOWS下通常是Ctrl+Z。