图书馆有本《C专家编程》,但似乎没有被人读过。这是本值得翻一翻的书。
理解C语言,最重要的在于认识它的设计思想及优劣。
C与Unix是相辅相成的,两者的思想也几乎一致。
比如,C强调一切由程序员实现,也因此,程序员需要保证自己程序的准确。malloc了内存,需要delete,而没有runtime的垃圾回收;在数组操作中,不对下标进行越界检查,如果要程序稳健,就自己实现吧。伴随着这些不便的,是程序员对程序无比精确地掌控,你永远都能(至少理论上能)了解自己的程序做了什么。
而要理解C语言的优劣,则需要先对其他语言有所了解(毕竟优劣都是相对的)。优点主要是对比C之前的语言,如它的祖宗BCPL,以及在早期广泛使用的Pascal、Fortran。缺点主要可以对比后来的语言,尤其是面向对象的C++、Java(但需要注意的是,C++对C的缺陷一部分予以了改进,一部分予以保留,其主要考虑是兼容性)。
当然,在“现代”,我们更会注意的是C的缺点。
认识到C有很多缺点,是很重要的(想起很多崇拜C并认为它无所不能的同学)。但具体了解有哪些问题,是更重要的吗?我并不这么认为,因为绝大部分问题仅在极端的情况下出现,只要我们保持了较好的编程习惯,大部分问题都不必在意。对喜欢钻牛角尖或者想参加混乱编程比赛的同学,顺便推荐一本《C陷阱与缺陷》。
然而,我觉得《C专家编程》给我最有意义的认识是,C的设计原则主要是两点:贴合底层硬件、易于实现编译器。
比如,C的基本数据类型,全是底层硬件支持的,在早期,甚至都没有浮点数这一类型(难以想象吧?)。
比如,C中不允许函数嵌套函数,就是出于编译器更易实现的原则。
体会到了这两点,就能对C为什么出现那些缺陷,有个全新的认识。
最后再说一下数组和指针。以前对它们的区别确实体会不深,看了《C专家编程》后有了一些感性的认识。话说,从编译器实现的角度来理解它们,真的是太爽了。
闲扯了一堆,似乎没有涉及具体的技术细节,也许会有同学失望。总之,建议大家有空的时候翻一翻这本小薄书,即便是多了点滴认识,都是好的。 |