毋庸置疑,C是非常流行的编程语言。正是因为流行,和它有关的图书之多,可以用多如牛毛、汗牛充栋来形容。

既然都已经这么多了,那我为什么还要再来一本,给牛增加负担呢?原因很简单:想看看是否能用一种和别人不同的方法来把C语言讲清楚。这本书面向初学者,但是,已经学过C语言的人也不妨读一读,因为我的讲解方法和对很多问题的阐述和别人不一样。请放心,我们不胡来,C语言有自己的标准,我们始终按标准来解释一切。 当然,自负是人类的共性,这本书是否真的能把C语言讲清楚,还得靠读者来检验。

C语言难学吗?来自这个行业的声音始终自相矛盾。一方面,很多过来人声称C语言其实很简单;另一方面,很多初学者觉得很难,不得其门而入。仅就语法而言,C语言确实比较简单。但是,这种简单性使得很多人对它的掌握只停留在似是而非的表面上。似是而非的学习一开始很轻松,但你走不远。实际上,即使是声称已经掌握了这门编程语言的人,对很多语法要素的认识和理解也是错误的,在书写稍微复杂一些的代码时,也发现自己突然变得糊涂起来。

那么,学习C语言的诀窍在哪里呢?

首先,掌握它的类型系统并学会以类型的观点来构造和解析程序中的代码,这样你就不会迷路。如果你没有掌握C语言的类型系统,不会从类型的角度来分析一个表达式,说明你并没有掌握C语言。

其次,你要了解C语言在整个计算机系统中的位置,知道它和操作系统或者硬件之间的关系;尤其是要理解库和C语言的关系,要明白是库拓展了C语言的实用性。除了C语言本身的简洁、优美和强大的表达能力外,C标准库和其他形形色色的库也是C语言变得流行并威力无穷的重要因素。

写一本编程语言的通俗入门教材,最痛苦的莫过于你不能一下子展现事物的全貌和众多细节。尽管你知道它,也渴望表达,然而毫不客气地说,读者们并不需要它。读者不了解原委,没有耐心,记不住,而且恐惧。为此,本书力求在以下几个方面做一些突破:

首先,C语言的知识点是网状的,是互相牵扯和交叉的,如果不加以梳理,随着阅读的深入,读者不理解的概念和术语将越来越多,从而产生挫败感。为了克服这一问题,我们把它变成线性的,还没讲到的内容一概不提,没讲过的概念一概不用;讲过了,有印象了,掌握了,再用来解释新的知识。

其次,对于一本C语言的图书或者教材来说,最怕的是陷于细节而无法自拔,这往往会使读者成为语法机器而不能领略C语言的全貌,不知道C语言到底有什么实际的用处,更不知道哪些知识才是最重要的。

因此,在内容的组织上,这本书的宗旨是先观其大略,而不是一上来就究其细节。如果只是陈列各种语法元素及其细节,我们可能需要写几百上千页,各种示例和习题堆砌其中。学生学完了,习题也做完了,还是莫名其妙,不知道C语言到底在整个计算机体系结构中处于什么位置,它和操作系统的关系是什么,也不知道为什么别人的程序可以播放音乐、处理图片、过滤网络数据包,而自己的程序只能打印哪些学生的成绩高于60分。

第三,考虑到类型系统的重要性,从本书一开始就逐渐强化类型的知识和基于类型的语法分析。这是掌握C语言的关键,不可等闲视之。

第四,多数教材和图书都从一个令初学者抓狂的语句
       printf ("hello world"); 
       开始,其理由是初学者可以马上看到“成果”,增加他们的学习兴趣。然而,除非是面向有编程经验的读者,否则这样做可能弊多利少。一方面,printf只是一个普通的输入输出函数,而且并不是C语言的组成部分,但初学者可能会先入为主地认为它就是C语言里的大梁;另一方面,这个函数并不是它表面上看起来的那样简单,实际上涉及多个知识点和概念,而且无法在一本书的开始部分完全展开。对于初学者来说,从一开始就将他们引入一个迷局可能并不值得。

考虑到这些,本书一反常态,将输入输出留到第6章单独讲述。在此之前,我们用调试软件来跟踪程序的执行过程并观察执行结果。事实上,程序调试是非常重要的技能,所以本书这样安排应该是科学的。

第五,本书有一章是专门介绍Windows编程的,虽然如走马观花一样简单,也会令某些读者质疑,毕竟C语言无关具体的硬件和操作系统平台。之所以这样安排,主要的目的是让读者领略C语言是如何在具体的平台上发挥作用的,以及库在这个过程中所起到的作用和扮演的角色,并从一个侧面解答C语言到底有什么用的问题。尽管C语言不依赖于平台,但用C语言写出来的程序却需要在具体的平台上执行。

第六,本书引入了很多概念和术语,但在正文中夹杂这些术语的英文拼写可能会对部分读者造成阅读障碍。考虑到这一点,我们在每一章的前面用思维导图单独列出,这样做的另一个好处是可以让读者清楚地知道本章中都讲了哪些内容。

第七,这本书开篇没有讲C语言的由来、历史、优点和应用领域,通常来说,这是一本C语言教材的格式化组成部分。但考虑到别的书都已经讲了,网络上也到处都有,所以我就没必要再啰唆了,请大家不要见怪。

最后,这不是一本类似于辞典或者语法参考手册之类的书,内容的组织具有渐进和逐步展开的特点,应该从第1章开始顺序阅读。在内容的组织上,本书前半部分以如何实现输入输出为主线:第1章引入C语言编程的基本概念和要素;第2章讲解程序的调试;第3章快速介绍C语言里的大部分表达式和语句类型;第4和第5章介绍指针和数组,为输入输出做最后的铺垫;第6章完整介绍输入输出。在积累了相当的知识和经验后,本书后半部分以如何实现汉字的处理(第7章)、如何编写Windows程序以及编写一个复杂计算器为主线(第8、9、10、11章),继续讲解C语言的语法。为方便起见,第12章详细介绍了C语言里的每一种表达式。

在学习这门编程语言之前,必须先了解计算机的工作原理,有使用计算机的经验。对于大学新生来说,我并不担心这一点,学校自有他们的教学计划和进度安排;对于自学这门编程语言的人来说,这是需要注意的。

纸质书的内容承载力有限,为了帮助大家更好地使用本书和理解书中的内容,我会准备一些辅助的学习资料,比如导读和习题解析之类的文档,它们都存放在我的个人网站上,网站的地址就在下面。当然,如果你有什么意见和建议,也可以在网站上留言,或者通过下面的电子邮件地址与我联系。

在即将出版之前,编辑同学希望我能在前言里提一提我以前写过的书。说白了,就是要做做广告。我当时就大义凛然地一口回绝:“此事决不可为!谦虚谨慎乃做人之根本,休想让朕把写过《穿越计算机的迷雾》和《x86汇编语言:从实模式到保护模式》这两本书的事说出来!”

王晓波和李双圆参与了本书的写作,我们在此共同祝愿读者们阅读愉快,早日通过本书掌握C语言的精髓。

李  忠           
2019年1月6日于长春

《C语言非常道》李忠相关推荐

  1. c语言非常道李忠答案,C语言非常道

    C语言的图书多如牛毛,但绝大多数都很单纯,无外乎语法.技巧或者实例.C语言的教与学,远不止语法和示例这么简单.语言是应用的工具,只能深入到历史和实际应用的土壤里,从现实中寻找这门计算机语言的定位,学习 ...

  2. C语言指针入门 《C语言非常道》

    C语言指针入门 <C语言非常道> 作为一个程序员,我接触 C 语言有十年了.有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出. 但是,李忠老师 ...

  3. 道可道,非常道;名可名,非常名

    在去美国之前,在佛法方面浸润了十多年.而到了美国之后,很快就结识了不少非常友善的中国或美国的基督教朋友.在美国,我感受到了基督教对西方社会道德教化方面所作的重要贡献,基督教呼吁信众听从上帝的话,遵守种 ...

  4. 非常道:ChatGPT 与思想革命

    服务器艺术 服务器ART 2023-03-14 17:37 发表于北京 收录于合集#ChatGPT1个 ChatGPT从去年出现到现在,已经变成当今最热的话题,对各个行业尤其是学术界影响非常大,也引出 ...

  5. R语言非独立多分组非参数检验、Kruskal–Wallis检验进行非独立多分组非参数检验(Nonparametric multiple comparisons)、当ANOVA不满足条件的情况下

    R语言非独立多分组非参数检验.Kruskal–Wallis检验进行非独立多分组非参数检验(Nonparametric multiple comparisons).当ANOVA不满足条件的情况下.R语言 ...

  6. 技术非中立,语言非同质:机器翻译正被用于维护文化障碍

    作者:王晔 转载自:AI科技评论 原文链接: 技术非中立,语言非同质:机器翻译正被用于维护文化障碍​mp.weixin.qq.com/s/t72b7um6FcKWoe3vvAigDw 当今世界随着大数 ...

  7. 五种C语言非数值计算的常用经典排序算法

    摘要:排序是计算机的一种操作方法,其目的是将一组"无序"的记录序列调整为"有序"的记录序列,主要分为内部排序和外部排序. 排序 排序是计算机的一种操作方法,其目 ...

  8. “道可道,非常道”——千年孤独话老子

      "道可道,非常道"--千年孤独话老子 文/ZSY2012,天地尘埃2020(3978711696) 摘要:对"道可道,非常道"这句话的解释,历来众说纷纭,令 ...

  9. 道德经 道可道,非常道。

    解读老子道德经,皆因<老子>之博大精深,非吾之一人能得其精粹,当今读<论语>正热,<道德经>,中华第一书,读来似更有悟,不如抛砖引玉,其参<道德经>中华 ...

最新文章

  1. “干细胞制剂制备与质检行业标准”上海“出炉”
  2. 物联网技术在智能医疗领域的应用与发展
  3. Python 技术篇-用request库调用莉莉机器人api接口实现与机器人对话实例演示
  4. sklearn中的Pipline(流水线学习器)
  5. 入门 | 如何为你的回归问题选择最合适的机器学习方法?
  6. tomcat7 1000并发量配置 tomcat7配置优化
  7. ora 所有表记录数_ORACLE中如何查找定位表最后DML操作的时间小结
  8. .bash_profile和.bashrc的什么区别
  9. nyoj--20-吝啬的国度
  10. python实现动态壁纸_如何实现一个 windows 桌面动态壁纸
  11. c51间隔点亮c语言编程,51系列单片机C语言编程
  12. jsPlumb点到点连线偏移
  13. 如何把桌面计算机和回收站隐藏,如何隐藏电脑桌面回收站?隐藏桌面回收站方法介绍...
  14. 【惊】手机将走向末路,混合现实(MR)难道就是5G时代的方向
  15. GHostNet网络最通俗易懂的解读【不接受反驳】
  16. 如何优化传统项目,提高web应用的吞吐量
  17. 【使用python和flask建个人博客】给个人博客增加了清单分类及计时功能,可以很方便的做时间记录,目标是为了能够跟柳比歇夫学习
  18. sharepoint 2013 文档库eventhandle权限控制
  19. web前端:波浪舞动开机动画loading,原生css、js,@keyframes应用
  20. 【回归分析】confounding effect 与 interaction

热门文章

  1. 堡垒机JumpServer(三):资产管理之资产列表
  2. 声明:关于原创与转载的标注
  3. Mybatis 开启驼峰命名不生效
  4. 苹果手机 h5网页或公众号视频无法播放问题处理
  5. Python爬虫和数据可视化
  6. 基于linux和qt的串口通信调试器调的设计及应用,基于linux和Qt的串口通信调试器调的设计及应用...
  7. php熊掌号api,thinkphp5.1如何实现熊掌号资源API提交功能?
  8. 内链、外链、反链、友情链接及相应作用
  9. 如何使用Word系统撰写和排版毕业论文
  10. BitPay将支持使用XRP购买礼品卡在连锁零售商和餐厅消费