#include <stdio.h>
main() {
printf("Hello world");
}
编译结果:
一次通过。
运行结果:
Hello world%
解释原因:
%字符是系统提示符,操作系统用它来提示用户输入。因为在程序中没有写明“Hello world”
应该换行,所以系统提示符%直接出现在输出“Hello world”消息之后。这个程序还有一个更加难以察觉的错误,以后再进行说明。
#include <stdio.h>
#include <stdlib.h>
int main( void ) {
printf("Hello world");
return EXIT_SUCCESS;
}
输出:
问题类型:
第二类问题,也就是程序并没有按照程序员所期待的方式执行(C语言程序)
int i;
int a[N];
for (i = 0; i <= N; i++) {
a[i] = 0;
}
代码用意:
初始化一个N元数组。
正确的初始化一个N元数组的方式为:
for (i = 0; i < N; i++) {
a[i] = 0;
}
运行结果:
在很多C编译器中,它将会陷入一个死循环。
心智模式(mental model)
程序构成:
从较低的层面考察,程序是由符号(token)序列构成的,正如一本书是由一个一个字词所组成的一样。
词法分析:
将程序分解成符号的过程。
语句和声明:
组成程序的符号,又可以看成是语句和声明的序列,就好像一本书可以看成是由单词进一步结合而成的句子所组成的集合。无论是对于书而言,还是对于程序而言,符号或者单词如何组成更大的单元(对于前者是语句和声明,对于后者是句子)的语法细节最终决定了语义。
语义细节:
第3章处理有关语义细节的问题:程序员的本意是希望表示某种事物,而实际表示的却是另外一种事物。
链接器:
第4章注意到这样一个事实:C程序经常是由若干个部分构成,它们分别进行编译,最后再整合起来。这个过程称为“链接”,是程序和其支持环境之间关系的一部分。
库函数:
程序的支持环境包括某组库函数(library routine)。虽然库函数并不是语言的一部分,但是它对任何一个有用的程序都非常重要。尤其是,有些库函数几乎会在每个C程序中都要用到。
预处理器:
第6章,由于C预处理器的介入,实际运行的程序并不是最初编写的程序。
可移植性问题:
第7章讨论了可移植性问题,也就是为什么在一个实现平台上能够运行的程序却无法在另一个平台上运行。
建议和参考答案:
第8章提供了有关预防性程序设计的一些建议,还给出了其他章节的练习解答。
附录:
附录讨论了3个常用的却普遍被误解的库函数。