C陷阱和缺陷 第0章 导读

本文详细解析了C语言程序的编译和运行过程,包括预处理器、链接器的作用,以及库函数的重要性。同时,指出了一种常见的数组初始化错误,可能导致无限循环,并探讨了程序的可移植性问题。此外,还提供了程序设计建议和相关练习解答。
摘要由CSDN通过智能技术生成

    #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个常用的却普遍被误解的库函数。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值