免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: KBTiller
打印 上一主题 下一主题

拙著《狂人C》出版,特邀CU网友垂注,并欢迎品头论足、批评指正 [复制链接]

论坛徽章:
0
141 [报告]
发表于 2010-12-06 23:15 |显示全部楼层
回复 279# 幻の上帝
幻の上帝的这个帖子我觉得显然是儿童不宜的
初学者看到这个帖子恐怕更学不懂指针了

我和幻の上帝有类似的感觉
C99指针部分似乎是由蹩脚的工程师写的,而不是由语言学家写的
C89指针部分写的要优美得多

论坛徽章:
0
142 [报告]
发表于 2010-12-07 13:32 |显示全部楼层
回复  KBTiller


    可是这么多年对c语言的学习,让我们不习惯看拼音组合的变量,这样看着很别扭,即 ...
snowboy9859 发表于 2010-12-07 08:48


   这可以降低学习门槛,增加代码可读性,难道不是吗?
   我知道有不少人对使用拼音或汉字编程一直看不惯,但却从来没见他们提出过特别站得住的理由

   记得鲁迅先生的《狂人日记》中有过一句话:“从来如此,便对么?”

论坛徽章:
0
143 [报告]
发表于 2010-12-08 07:14 |显示全部楼层
本帖最后由 KBTiller 于 2010-12-08 07:18 编辑

回复 283# mirnshi
很多情况下,是习惯问题。当面对这if/while/include等等一堆英文单词,再来写拼音变量,大脑有时会短路。碰上拼音缩写--只写声母,更是恐怖。作为入门书籍,授人语言同时,同时教导读者写一个规范的C程序,是更上一层楼。

首先,非常感谢mirnshi网友发表对本书的批评意见。
我有些拿不准的是标识符的命名问题究竟是宗教问题还是哲学问题
实际上,mirnshi网友所说的“作为入门书籍,授人语言同时,同时教导读者写一个规范的C程序”,我完全赞同。这大概就是传说中的“英雄所见略同”吧。
还有一句话叫“君子和而不同”,我与mirnshi网友之间看法的区别在于规范是否要求一定用英文单词命名
鉴于前面snowboy9859网友也有与mirnshi网友类似的看法,我愿意在这里全面地说一下我最初的考虑,欢迎大家继续评议

1. 标识符
    由程序编写者所取的名字都叫做“标识1符”(Identifier)。
    C语言的语法对标识符提出的语法要求是:由字母、下划线(_)、数字组成,不能以数字开头2
    从代码质量、程序可读性及编程修养的角度对标识符提出的要求是:“知意简明”,“知意”毫无疑问更重要些。当然,这不是C语言强制性的要求。许多不注意编程修养的人活的也很好。正如很多人不注意个人修养一样,法律是管不到他的。这是一个境界的问题。
    一般来说,由低到高,编写代码的境界依次是:机器能懂,自己能懂,别人能懂。
    所以,自己懂得自己命名的标识符的含义并不是一个很高的要求。不要动不动就是a、b、c或a1、a2、a3那样的乱取名,这如同给自己的子女取名小一、小二、小三一样粗俗。
    在程序中使用英文单词取名并不应当受到指责,假如你的英文足够好的话。但如果你的英文尚不敢亮给你的英文老师看的话,建议你还是使用汉语拼音,毕竟你编程的水平和你的英语水平毫无关系。笔者曾经在一本书见过一个代码,一本正经地把“体重”和“身长”分别取名为“weight”和“feet”,也见识过某本书上一段关于素数的代码中居然出现了leap(闰年)这个标识符的例子,结结实实且前所未有地把编程提高到了幽默的境界。
    标识符的长度是受限制的,C99要求编译器至少要容许63个有效字符,C89是31个。各个编译器也可能有自己的限制,请留心一下编译器的使用说明。
    一般情况下,重名是不容许的,这会带来混乱。在一定条件下重名是容许的。但是容许并不意味着鼓励。笔者见过一些考试题目,考的就是重名的问题,然而那种写法本身就是一种恶劣的编程方式,因此笔者对于这种考题的目的也是一直非常不解。
    在这里忠告诸位读者,尽量不要重名,除非是在程序的不同的区域内。这就如同在两个不同班级上有同名的同学一样,通常不会带来什么麻烦。如果在同一个班级发生重名,通常“后果很严重”。
    优秀的软件企业一般有自己的命名规范,如果你在企业工作,你应该遵守你本企业的规范。本书采用的风格是:见名知意,即采用了汉语拼音。然而见名知意与简洁通常是矛盾的,有时必须在两者之间进行权衡与折中,所以例外的情况是特别常用的如循环变量用i或j,临时变量用tmp这样简单的名字而不是汉语拼音。本书无意把这种风格强加于任何人,只希望能达到使代码更具有可读性同时能使读者建立起命名规范的意识的目的。
________________________________________________________________________
1.读音为“标志”。
2.这是一个过时的陈述。C99容许标识符可以由更广泛的文字(ISO/IEC 98991999Annex D)组成。鉴于编译器的限制,本书的标识符依然依照原来的方法构造。

《狂人C》第29页~第30页

论坛徽章:
0
144 [报告]
发表于 2010-12-08 13:18 |显示全部楼层
地址也好、内存单元编号也好,只要学习了计算机组成原理之类的基础课程,是不难理解的。如果没有学过, ...
mirnshi 发表于 2010-12-08 00:58



    您的方法非常好,很简单。但我觉得有一个问题,就是难以为继。比如,该章后续章节中的
   
  1. int (*(*(*func)(int *))[5])(int *);
复制代码

    用您的方法恐怕就不那么好解释了

论坛徽章:
0
145 [报告]
发表于 2010-12-08 20:13 |显示全部楼层
对于这种写法,恐怕存在试卷上的意义要远远大于实际编程中。有些回字有多少种写法的味道。函数指针理解 ...
mirnshi 发表于 2010-12-08 14:42

    我的看法不是这样。我认为对于复杂的问题,使用这样复杂的数据类型是十分可能的。实际上第十一章确实有不少这样的应用
    当然不使用复杂的数据结构问题也未必不能解决,但算法要复杂得多。
    能针对特定问题构建巧妙的数据结构在我看来是使用C的乐趣之一

论坛徽章:
0
146 [报告]
发表于 2010-12-08 20:16 |显示全部楼层
引用错了吧。
看起来是指C99的Annex J:
幻の上帝 发表于 2010-12-08 16:53

不,我是指 Annex D (normative) Universal character names for identifiers

论坛徽章:
0
147 [报告]
发表于 2010-12-08 22:31 |显示全部楼层
额,拼音的问题是歧义太多,汉语同音词太严重,就算都是中国人也受不了。反而极大的降低了代码的 ...
donotblock 发表于 2010-12-08 13:29



    您提到的“拼音的问题是歧义太多,汉语同音词太严重”的问题是存在的
    您主张不为工程“花费的额外精力”我也赞同
   
    但我觉得使用英文单词我觉得未必也能完全避免这些问题。
    比如,一个不熟悉的业务也就意味着不熟悉相关的专业词汇,现背单词吗?这也需要“花费的额外精力”。而且一旦团队内部的英语水平良莠不齐怎么办?他们能够懂得对方的“英语”吗?
    再说同音字的问题,我见过初学者用time做标识符,尽管可以,但与库函数同名,理应避讳。就是说英文也可能存在类似的问题
    其他:
    我见过太多使用英文单词但却不通到了令人发指地步的中文程序设计语言书
    C99开始容许其他字符做标识符,在我看来是一个友好的提示,为什么我们自己要作茧自缚呢
    我主张像写作文那样写代码,代码应该是可以朗读的。要做到这点,最方便的是母语,毕竟我们就是用这种语言思考问题的,用她表达也最方便容易
    我反对为初学者设置完全不必要的“英语”门槛
    “汉语同音词”在函数局部一般不会成为什么问题,只要函数不是特别大
   “局部变量都得依靠详细的注释”,我一点都不觉得丢人,任何增加可读性的努力我认为都不会白做。事实上我主张注释至少应该在代码占一半的篇幅,而且应该先写注释后写代码,注释写好了,代码是件简单的事情

论坛徽章:
0
148 [报告]
发表于 2010-12-08 22:35 |显示全部楼层
偏偏C里面的address constant和其它课程里面讲的address有很大的不同。
先有了address的概念,再学C, ...
幻の上帝 发表于 2010-12-08 16:46



    能否详细说说有什么不同?

论坛徽章:
0
149 [报告]
发表于 2010-12-09 13:00 |显示全部楼层
有幸读到此书,可看到作者的深厚功底,C语言对我们来说很熟悉,但,读起来,还是收益匪浅。对我们用C语言开 ...
底层开发 发表于 2010-12-08 18:48



    过奖

论坛徽章:
0
150 [报告]
发表于 2010-12-09 13:08 |显示全部楼层
    这么说吧,你如果直接用汉语比如“经过的时间”等,或者用全拼jing_guo_de_shijian,我也觉得ok。

问题是你引导了一种不健康的编码风格,变量名不能尽量见名知意。 如果你根本不认同变量名应该尽量见名知意这个准则, 而认为应该全部依赖注释,那可以当我没说。 举个简单的例子,假如你的一个函数有40行,第30行用到了第2行定义的一个变量,如果按照你那种风格,我读到30行很可能已经忘了这个变量是啥意思,还得回头看注释。 本来很简单能够自我解释的代码,非得这样才能看明白,你觉得好么? 程序员的精力确实不应该花费在这种额外而毫无意义的消耗上。

还有,我觉得你错误理解了注释的意义,注释并不是用来标注每一个变量是什么意思的。。。 因为变量名对编译器来说本来就没有意义,编译完了它应该是被内部标识符替换掉或者直接是地址表啥的(我不熟悉编译原理,细节不清楚),之所以要给一个变量一个名字,就在于让它更可读。 那你再把每个变量名弄个缩写,再加注释。。。我觉得发明变量名的人要哭了。donotblock 发表于 2010-12-09 10:11



    “不认同变量名应该尽量见名知意这个准则”这个指责我是绝对不会承认的,事实也并非如此。
    但是在这个方面是否我做的可能还不够好,我会认真反省。
    您的“用全拼jing_guo_de_shijian”的建议我觉得非常值得认真考虑
    此外我觉得函数有40行是否太长?我对初学者的建议是20行,在这种情况下我觉得多半不会发生忘记变量名含义的事情
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP