免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
281 [报告]
发表于 2010-12-07 13:32 |只看该作者
回复  KBTiller


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


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

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

论坛徽章:
0
282 [报告]
发表于 2010-12-07 20:29 |只看该作者
我读了几页,就说下面这段话吧
   
我觉得讲的非常好,变量名本身也占用内存,所谓这个变量的地址就是 ...
hobbs136 发表于 2010-11-30 17:12



    变量名本身也占用内存这个 不对,我跑题了

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
283 [报告]
发表于 2010-12-08 00:36 |只看该作者
这可以降低学习门槛,增加代码可读性,难道不是吗?
   我知道有不少人对使用拼音或汉字编程一直看 ...
KBTiller 发表于 2010-12-07 13:32


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

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
284 [报告]
发表于 2010-12-08 00:58 |只看该作者
回复  幻の上帝
幻の上帝的这个帖子我觉得显然是儿童不宜的
初学者看到这个帖子恐怕更学不懂指针了

我 ...
KBTiller 发表于 2010-12-06 23:15


地址也好、内存单元编号也好,只要学习了计算机组成原理之类的基础课程,是不难理解的。如果没有学过,理解起来很困难。很多人眼里C就是个“高级汇编”,所以很多人用稀奇古怪的语句榨干CPU个每个指令周期,说成地址无可厚非。
我给入门的人讲C指针,就是告诉他们指针就是一类数据的索引,不用考虑这类数据的内部组成,指针就是一张卡片,上面写着这类数据的地址(如果学过基础课,就可以理解为内存地址,如果没学过,就可以理解成日常生活中的门牌号地址)。用索引的方式,也更容易理解指针的指针,就是二级索引,再进一步就是三级索引。
只要读者读后,能理解指针了,能够写出不犯规的程序,就是好书。

论坛徽章:
0
285 [报告]
发表于 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
286 [报告]
发表于 2010-12-08 13:18 |只看该作者
地址也好、内存单元编号也好,只要学习了计算机组成原理之类的基础课程,是不难理解的。如果没有学过, ...
mirnshi 发表于 2010-12-08 00:58



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

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

论坛徽章:
0
287 [报告]
发表于 2010-12-08 13:29 |只看该作者
本帖最后由 donotblock 于 2010-12-08 14:05 编辑
这可以降低学习门槛,增加代码可读性,难道不是吗?
   我知道有不少人对使用拼音或汉字编程一直看 ...
KBTiller 发表于 2010-12-07 13:32



    额,拼音的问题是歧义太多,汉语同音词太严重,就算都是中国人也受不了。反而极大的降低了代码的可读性。  比如MSX,如果你不加注释,谁知道意思是秒上限? 如果是英文,意思就非常明确

    看了你的试读章节:
  1. #define MSX 60 //秒数的上限
  2. #define FSX 60 //分数的上限
  3. #define SSX 24 //时数的上限
  4. int main ( void )
  5. {
  6.   int s = 21 , f = 36 , m = 23 ;      //时、分、秒
  7.   int jgs = 3, jgf = 28 , jgm = 47 ; //经过的时、分、秒数量
  8.   printf ( "%d点%d分%d秒后再过" , s , f , m ) ;  
  9.   printf ( "%d小时%d分%d秒是" , jgs , jgf , jgm ) ;
复制代码
你真的觉得连局部变量都得依靠详细的注释才能看懂的代码是好代码?  jgs,jgf,jgm...我只能说太恐怖了

还有这个:
  1. /*jg()函数功能:
  2.   根据初始时间和时间的增量
  3.   求得最终的时间
  4. */
  5. struct shijian jg( struct shijian sj , struct shijian zl )
  6. {
  7.   struct shijian zz;
  8.   zz.shi  =  sj.shi + zl.shi ;
  9.   zz.fen  =  sj.fen + zl.fen ;
  10.   zz.miao =  sj.miao + zl.miao ;
  11.   zz.fen  += zz.miao / MSX ;
  12.   zz.miao %= MSX ;
  13.   zz.shi  += zz.fen / FSX ;
  14.   zz.fen  %= FSX ;
  15.   zz.shi  %= SSX ;
  16.   return zz;
  17. }
复制代码
在读调用这个函数的那段代码时,如果不看你的函数定义和注释,从jp这个名字能猜出来它的功能么? 每个函数调用都要花费额外的时间才知道在做什么,那要理解一个真正的工程需要花费的额外精力就很可观了...

敢于打破常规是好的,但大部分常规因为经过了时间检验而有它的道理。 套用鲁迅先生的话, “从来如此,便不对了么?”

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
288 [报告]
发表于 2010-12-08 14:42 |只看该作者
int (*(*(*func)(int *))[5])(int *);


对于这种写法,恐怕存在试卷上的意义要远远大于实际编程中。有些回字有多少种写法的味道。函数指针理解为索引也可以,一堆代码的索引,而且这些代码的大小是未知的。相同参数、相同返回值的函数指针可以组成一个指针数组,相当于2级索引。

对于函数指针的应用,我的理解是为了简化调用。举个简单的例子
  1. struct stub
  2. {
  3.     char *name;
  4.     int (*f)(char *);
  5. };
复制代码
这种结构经常用于根据一个字符串来执行某个处理/命令,使用这种结构可以极大简化编程。

论坛徽章:
0
289 [报告]
发表于 2010-12-08 15:20 |只看该作者
变量名本身也占用内存这个 不对,我跑题了
zengit 发表于 2010-12-07 20:29


这样我又有点模糊了,能否详细解释一下运行时程序的内存结构?

论坛徽章:
0
290 [报告]
发表于 2010-12-08 16:46 |只看该作者
地址也好、内存单元编号也好,只要学习了计算机组成原理之类的基础课程,是不难理解的。如果没有学过, ...
mirnshi 发表于 2010-12-08 00:58


偏偏C里面的address constant和其它课程里面讲的address有很大的不同。
先有了address的概念,再学C,一不小心就混了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP