think in c学习与总结 chapter1

起因:为什么开始看think like computer scientist(C version)

从大学毕业后,C语言开发在工作中比较少,C语言作为人生第一门计算机相关基础课程.不仅帮助我打开学习计算机的大门,也给了我这样的初学者的当头一棒.

我现在还保留着当初谭浩强的绿皮书,书上做满了笔记.

可能会有人觉得谭浩强的书不好,不过我觉得这不是关键所在,关键在于可能当初第一门学习C语言的教材如何.可能影响更大的在于,学习一门计算机语言时,对计算机的原理与构造还是一片空白,这样对于语言中的知识就更多的只能死记硬背,而不是融会贯通.

而站在今天的时间点上,我对计算机的组成有了一些认识,不再是之前的一无所知了,但C语言却是再没有重新温故过,所以就有了这次重温并继续深入学习C语言的想法.

为什么是think in c

作为C语言复习的第一步,书籍的选择就变得很有意思,我不再想使用谭浩强的那本书来回忆知识了,而是打算选用一本或多本更通用,更有一些传奇色彩的书籍,think like computer scientist(C version) 像计算机科学家一样思考,C语言版本,算是一本很基础的书籍,但是它对一些计算机术语的解释也就基础到非常直白,直白到拿自然语言和形式化语言作对比,让人很容易理解.所以我个人把它选做我回忆C语言知识的第一本书籍.

本系列博文将要做什么

在后续一系列文章中,我会把自己的学习总结更新至博文中.谈不上什么全新的内容,因为原书是英文版的,所以我做的就是把其中比较关键的点做一些翻译整合出来,仅此而已.可能内容不会特别丰富,不过都是高级语言学习开始最基础的内容.

第一章 程序的执行路径

编译型与解释型高级语言

本章开头,作者就论述了编译型高级语言和解释型高级语言的区别,别的不多说,两张图就可以搞定
编译型语言执行流程
对于编译型语言,就是通过一次编译后,获得一份目标代码,也就是二进制文件,使得后续的执行,对于兼容的平台,直接运行该目标文件即可.
解释型语言执行流程
对于解释型语言的执行,不再由编译器而是由解释器将源代码逐行解释成二进制并运行,所以每次执行的输入就是源代码,而不像编译型语言,每次执行的输入是二进制文件中的代码.

Bug的定义与debug

  • bug就是导致程序错误的代码,虫子的来源也源自史上第一个计算机bug,因一只虫子飞进了当年计算机的组成部分-继电器中
  • 有编译时错误,如果源代码中有语法错误,会让编译过程失败,代码都不会执行,因为还没能成功转换成目标代码
  • 编译没问题后,更多会有运行时错误,c语言更接触计算机底层,当你在程序中错误的操作了内存地址后,可能会导致程序在运行时行为异常
  • 逻辑错误,语法和运行都没有问题,但运算的结果不是想要的结果,这会比前两种错误花费更多的时间进行查错,基本上需要逐行执行,查看数据流的变动,以查出哪里的变动出现了问题.

自然语言与形式化语言

在书中,我第一次接触到形式化语言的概念,不像汉语/英语这些人说的自然语言的在历史的进程中自由发展,形式化语言是人刻意创造的,如数学公式,化学公式,这些被创造来代表特别的运算.而计算机语言也是一种形式化语言,它被创造出来是为了来表达算法的.

而对于语句,实际上都会有一个解析的过程(parse),只是这个过程对于我们来说已经是条件反射的事情,所以我们不太会察觉到.如3=+6¥就不是一个正确的数学计算式,因为¥符号不能直接与数字相加,这在符号的表达上不正确,另外你也能感知到=+的不正确,因为这不是正确的计算式所拥有的结构.

从上面的例子,可以大致看出来.语法的规则主要有两部分组成:象征词和结构体,3=+6¥的不正确,因为¥在加法计算中不是正确的象征词。+=不是一个正确的结构体.这样的过程,就是在解析语句.

自然语言与形式化语言的区别

  • 自然语言可以有歧义,但是形式化语言不能有歧义,如果一条程序语句的意思模棱两可,那么执行结果就未可知了,这不是我们所期望的
  • 自然语言为了容纳很多歧义,有很多冗余,比如同义词,近义词等等,但形式化语言更加精简和明确
  • 自然语言有许多比喻和隐含意义,而形式化语言不会有,就明确的代表着它的含义

对程序的理解

  • 首先要知道形式化语言比自然语言难懂,需要很长的时间来阅读
  • 其次,程序的结构很重要,有时候从上到下从左到右的阅读不是一个好主意。取而代之的,程序的阅读者在脑海中解析程序,识别符号并解释结构或许是一个更好的选择.
  • 最后,记住细节是最重要的,任何细微的的内容如拼写错误或标点符号,都会使得整个程序的执行变得不一样

C语言代码的组成

  • //之间的内容是C语言程序代码的注释,在程序运行时不会产生任何的影响.
  • 程序启动后,从main函数中的第一条语句(statement)开始执行
  • main函数需要指定返回值类型

C源代码编译的坑

  • 有时候编译器给到的报错信息很准确,你只需要修复报错的地方即可
  • 但有时候编译器的报错信息会误导你,所以你要培养一种直觉,什么时候相信编译器,什么时候自己解决(当然这是在错过足够多次后,自己总结才能得到的)
  • 编译器对配对圆括号或花括号,就我故意尝试的错误中:当缺失的是需要前后配对代码中的后半部分时,编译器能比较正确的提示你缺失的信息;但如果是前半部分缺失,则容易产生误导的报错信息,这里的报错信息就天马行空了,编译器猜不到你想做什么了.猜测和编译原理的前后匹配有关系

本章结语

在看第一章的时候,并没有做太多的笔记,因为一些基础概念和名词的引出比较多,后续的章节,这本书会开始介绍基本的编程概念在C语言中的实现.敬请期待下一篇第二章的内容.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值