再说谭浩强大师的“赋值表达式”

14 03 2009年

俺开始跟着谭浩强大师的《C程序设计》第三版开始学习C语言了。学到现在,发现的最精彩的部分,是第3章第9节第4小节“赋值表达式”(第63、64页)。

谭大师在这一小节指出“常变量不能作左值,因为常变量不能被赋值”。张云楼同学满面疑惑举手提问:“有常量、有变量,什么叫常变量呢?”听说张同学跟谭大师学了10几年的C语言,从第一版学到第三版,眼看着本书发行量从300万长到1000万,怎么连这写得是最清楚的一句话都不明白呢?赶紧翻书,发现这也怪不得张同学:本书只讲了常量、变量,除本小节这句话外根本就没“常变量”这仨字;突然蹦出来个新名词新概念,同学们摸不着头脑啊。课外俺又考证了一番,本书第二版还没有“常变量”一说,但在2004年和2006年谭大师分别出了一本《C++程序设计》和《C++面向对象程序设计》,其中有一节“用const定义常变量”。看来,这个“常变量”果然就是eng老师课外指导张同学时说的constant variable,即用const标识符所标识的、初始化后程序不能改变其值的变量。好像K&R(The C Programming Language)第二版至少在10年前(也有可能在20余年前第二版初次发行的1988年,未能考证)就按ANSI C标准全面讲述了这个const标识符;相比之下,好像谭大师有点儿与时俱进得太慢了吧?稍微“俱进”了一下,又有点儿太急躁太粗糙了吧?

更精彩的还是本小节那些赋值表达式的例子,那简直是在英勇地挑战脆弱的C编译器的容忍极限。除了据“注意版本”同学说“有些版本的编译器确实是支持”、但不幸不被本书推荐上机用的Turbo C 2.0、Turbo C++ 3.0、Visual C++中的C编译器支持、eng老师怀疑只有“谭氏版”编译器才支持、挑战极限可能没有成功的表达式(a=3*5)=4*3外,最令人惊叹的是谭大师给出了求解步骤的这个表达式:a+=a-=a*a。多亏了谭大师的循循善诱,否则这个表达式非把俺搞“精分”了不可。

据谭大师书中说,类似的这些赋值表达式还是“C语言灵活性的一种表现。在第6章中将进一步看到这种应用及其优越性”。可是,俺那个程序员邻居告诉俺,说是这种晦涩的表达式正是编程大忌;有一回他卖弄了一下,写了个类似这样的表达式,竟然还被人骂作变态。

原本简单明了的赋值表达式竟然可以复杂到这种程度,比“茴”字的四种写法都难。感谢谭大师,让俺终于明白了为什么很多同学都说C语言很难学,更让俺为学完了本小节而感到无比的骄傲。


操作

文章信息

5篇回复 to “再说谭浩强大师的“赋值表达式””

14 03 2009年
普陀鹅耳枥 (01:24:13) :

Yush最好从总体上说说谭浩强有什么问题,比如如果你觉得谭浩强的书主要是教人应付考试,并没有把编程员应有的精神贯彻在书中,那么你最好点明一下。现在揪这些小问题是只见树木,不见森林。

谭的书我大学的时候也用过,印象最深的是,他不用流行的联合、结构之类译法,而是从日文中借用共用体、结构体这些比较清晰的术语,这说明他还是很有创见的。我对术语比较敏感,所以当时对谭浩强感觉挺好。

14 03 2009年
bonntom (02:45:33) :

对于编程产品,程序员应该编写简单明了的程序,因为这程序将来会被其他程序员所修改。不过在教材里,展示那些比较古怪的语句是为了让我们更好地理解编译器的工作方式。例如,a[p]表示数组a的第p+1个元素,但是你知道你写成p[a]其实也是一样的吗?原来编译器是把这句翻译成*(a+p)的。但是那并不意味着我们要使用那些技巧,毕竟,程序不单是给机器读,还是给人读的。因此,作为教材,可以展示那些古怪的技巧,但必须附带解释编译器的工作方式,而不是用来炫耀编译器的神秘。。。。

16 03 2009年
普陀鹅耳枥 (04:29:02) :

对了Yush,干吗不把以前的文章也都备份过来?

17 03 2009年
Yush (12:41:53) :

回普陀鹅耳枥,我还没顾上整。有些插图没有了,有些过时效了。再说,新语丝新到上都有。

谭浩强C教材总体没有问题。个别地方讲了一些偏门、不合标准、不切实际的东西,比如赋值表达式那节。个别地方有些罗嗦,比如数组名作函数参数那节。

其实他下一版次能把赋值表达式那节改了,就不费我写这篇评论了。从第1000万+1开始的那些读者将因此受益,每人可节省半小时时间。

 

8 04 2009年
cbear (05:57:25) :

国人的教材很多都喜欢搞这口,借以炫耀自己的高智商。

留言

您可以用这些标签 : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

CAPTCHA Image
*