读书笔记

the C puzzle book

2008年4月7日 阅读(78)

中文译作<<c语言解惑>>,书薄薄的,自辩三节课就啃完了,看来以后上课就得带这种小书,下课刚好看完,也不用听老师瞎掰。

看了就记点笔记吧,省得以后忘了,还要重新看。书短小的很,100多页,一般来说c的书都不厚,不像c++之流的,随便一本书居家就可以当枕头,出门可以当砖头用,^o^。一个侧面说明了c语言的短小精悍,本身限制很少,而限制越少,则灵活性越大。

书里把学一门语言分成三种境界,就像王国维的读书三境界。既然扯到这个王国维了,就多扯点吧,民国时代清华国学院的四大导师之一,国学修养甚高,可惜后来投河而尽,生前吃过皇粮,任过南书房行走之类的职,看来牛人都是经常在书房行走的。。。

接着扯那个读书三境界吧,其实呢,很多事情都像读书这样,都有这么几个境界。第一境界出自晏殊的《蝶恋花》:“槛菊愁烟兰泣露。罗幕轻寒,燕子双飞去。明月不谙离恨苦。斜光到晓穿朱户。昨夜西风凋碧树。独上高楼,望尽天涯路。欲寄彩笺兼尺素。山长水阔知何处。”原意是说,“我”上高楼眺望所见的更为萧飒的秋景,西风黄叶,山阔水长,案书何达?王国维此句中解成,做学问成大事业者,首先要有执着的追求,登高望远,瞰察路径,明确目标与方向,了解事物的概貌。

第二境界出自柳永的《蝶恋花》。原词是:“伫倚危楼风细细,望极春愁,黯黯生天际。草色烟光残照里,无言谁会凭阑意。拟把疏狂图一醉,对酒当歌,强乐还无味。衣带渐宽终不悔,为伊消得人憔悴。”王国维在这里,显然也已超出了原诗相思怀人的情绪了。他想说明,对事业,对理想,要执着追求,忘我奋斗,为了达到成功的彼岸,一切都要在所不惜。

第三境界采用了宋代词人辛弃疾《青玉案•元夕》中的词句。辛弃疾的原词是:“东风夜放花千树,更吹落星如雨。宝马雕车香满路,凤箫声动,玉壶光转,一夜鱼龙舞。蛾儿雪柳黄金缕,笑语盈盈暗香去。众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。”王国维用在此处,是指在经过多次周折、多年磨练之后,就会逐渐成熟起来,就能明察秋毫,豁然领悟。这就达致了最后的成功。所谓踏破铁鞋无觅处,得来全不费功夫。这是厚积薄发、功到自然成。

不过这里的语言的三境界就狭隘多了,一:熟悉基本的语法规则,保证代码可以通过编译器的编译;二:可以以编译器的眼光看待代码,知道它所做的工作;三:养成自己的语法习惯,可以熟练的解决问题。这本书呢,是针对第二境界所做。

这里说的三境界可以深化一下,也就是说可以理解得更深刻些,或者再加上几个,语言关键在于理解其设计的目标,以及如此设计的原因,即设计取舍的原因和根据,按照编程之道的说法就是,每门语言都有其道,而道含阴阳相合,当知其阴阳然后用。

book:cpl-〉c traps and pitfalls -> c and pointer -> c expert programming -> c api source code

开始看,感觉写的还可以,主要是第一章还可以,其他章节比较简单,很快就过完了。其实呢,个人感觉本书写的比较一般,如果你对操作符还有些疑问,看下可以帮你澄清一些,其他诸如指针,宏的,无过人之处,与经典的c书籍还是有差距的,可能国外名家太多了,这本的确算不上一流。即使如此,还是写下吧。。。

第一章是关于操作符的,主要涉及到优先级,结合性和求值顺序,通过此书可以再一次理解下它们之间的关系。更深入的理解应当是去研究下编译器的行为。

总的说来,优先级,结合性都是用来确定一个表达式里变量和操作符的绑定,即给一个表达式,它们两个确保可以让你写出一个该表达式的唯一的无歧义的加括号方式。只是结合性只有在优先级相同时才发挥作用,但里面值的求值顺序却不能被限定。一般计算表达式值的做法是严格采用上述规则,给表达式加括号,就能理解其含义。
举个例子:x || !y && z   -> (x || ((!y) && z))),根据优先级,结合性可得出如此加括号方式。
但是不涉及求值顺序,不代表!y会首先求值,反而根据||的求值顺序,x会先求值。

表达式的优先级如下排列:
关联运算符:[] -> . ()
一元:* !++ sizeof &
算术:* / %
算术:+ –
移位
关系
逻辑
条件:?:
赋值:= += *= /=
一句话:算移关逻赋 ,一元比二元优

结合性:
只有一元,赋值,?:属于从右到左结合,其他均为从左到右。

求值顺序:
只有逻辑&& ||,赋值,?:有规定,其他都未定义

关于副作用:可以根据优先级,结合性得出加括号方式,然后枚举可能的求值顺序,如果出现结果不同的情况,说明存在副作用,应当避免。

本书的一些规范,罗列几点:

1.对于操作符可能存在歧义的,原则是尽量让操作符的字符数目多,如x+++++y 实为x ++ ++ + y
2.移位运算:左移均在低位补0,右移则对于正数均在高位补0,而负数的高位是否符号扩展,无明确定义,决于编译器实现
3.求值顺序从最外层运算看
4.A*=B  即 A = A * (B)
5.x++,表示先用x值,然后x自增
6.类型字节数,与硬件相关,尽量避免不同类型混用
7.if-else ,注意else的最近优先原则
8.预处理原则:
8.1如果宏里存在运算符,则外围加括号
8.2尽量紧凑
8.3避免使用二义性和副作用的表达式
8.4应该成为一个完整的c元素,如只有if可能造成与else结合,覆盖原来的if
8.5如果在不同地方多次使用,应用函数可以减少代码所占内存空间,
8.6宏的目的是,减少函数调用时间,以达到高效的目的,如果此目的无法实现,或者被抵消,则应该使用函数。

You Might Also Like