接着上次的学习。之前在读谭师傅的书时,有的地方跳过去了。现在重新回过头来看看第四章,《最简单的C程序设计--顺序程序设计》。
第4.1节是《C语句概述》。我们来看看谭师傅的图4.1。
在这里我们可以很清楚的看到,这里少了点东西:函数声明。如果一个文件有函数声明,但没有该函数的函数体,则按这个图,这个文件不是C程序。再严格一点,这里还少了注释、typedef的位置。
谭师傅在讲解的时候说,“一个C程序可以由若干个函数和预处理命令以及全局变量声明部分组成”。这问题就更大了。如果我有一个 struct foo { int bar; } ,可能还可以勉强算是“数据声明”,但决不是全局变量的声明。静态变量的声明也没有包括在里面。
谭师傅接下来把C 语句分为5类,分别是(1)控制语句、(2)函数调用语句、(3)表达式语句、(4)空语句,以及(5)复合语句。这种分类方法和通常使用的分类方法(即 C标准中使用的分类方法)不同,很可能会造成初学者的误解。例如,谭师傅说,if()…else…这样语句的小括号里的内容是一个“判别条件”。 这个判别条件是个什么东西?它是不是一个语句?谭师傅没有讲。其实,它就是一个表达式,而且对它的返回值有一定要求(必须是scalar type)。按谭师傅的说法,for()… 的小括号里也是一个“判定条件”。这个判定条件是什么东西?它是三个用分号隔开的表达式(或按最新的标准草案,可以是一个声明加两个用分号隔开的表达式)。另外,函数调用也是表达式(这点谭师傅自己也提到了)。空语句其实也是表达式语句,理解了这点才能知道为什么可以写出 for(;;)… 这样的语句。我不明白谭师傅在搞出这么一个不伦不类的“分类”的时候有没有好好读过K&R或者C标准。
第4.3节讲的C语言的输入输出。谭师傅讲了什么是头文件:“文件后缀中‘h’是head的缩写,#include命令都是放在程序的开头,因此这类文件都被称为‘头文件’。” 这里有点小问题,h应当是header而不是head的缩写。
谭师傅还说,在包含stdio.h的时候,既可以用 #include <stdio.h>,也可以用 #include “stdio.h” 的形式,但却没有讲两者的区别。这是初学者比较容易搞混的地方,不该放过。事实上,对于编译系统提供的头文件,用第一种形式比较好。
第4.4节给了几个例子。我们又一次看到谭师傅把字符常量的类型当成了char,把getchar()的返回类型也当成了char。而实际上这两者都是 int。
第4.5节在(12)里已经学习过了,这里就不多说了。