优质c程序秘诀---第 7 章 - 编码中的假象

优质c程序秘诀---第 7 章 - 编码中的假象

ID:14168879

大小:79.50 KB

页数:17页

时间:2018-07-26

优质c程序秘诀---第 7 章 - 编码中的假象_第1页
优质c程序秘诀---第 7 章 - 编码中的假象_第2页
优质c程序秘诀---第 7 章 - 编码中的假象_第3页
优质c程序秘诀---第 7 章 - 编码中的假象_第4页
优质c程序秘诀---第 7 章 - 编码中的假象_第5页
资源描述:

《优质c程序秘诀---第 7 章 - 编码中的假象》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、第7章编码中的假象写小说,就希望每一页都能吸引读者,使读者激动、吃惊、悬念!决不能使读者感到厌烦。因此在每一页都要撒些胡椒粉,描述一些场景来吸引读者、如果小说写成;“罪犯走近乔并刺伤了他”,读者就会睡觉了。为了使读者感兴趣,就要使得当描述到乔听到身后“咚!咚!咚!”的脚步声时,读者也能感觉到乔是怎样的恐惧;当“咚!咚”的脚步声慢慢地越来越近的时候,读者也能感觉到乔的手在冒汗;当脚步声加速,罪犯朝乔逼近的时候,读者也能理解到乔是怎样的惊慌。最重要的是读者保持着悬念,乔能不能逃脱?……在小说中使用惊奇和悬念很重要也很必要

2、。但是如果把它们放到代码中,那就糟糕了。当写代码时,“情节”应该直观,以便别的程序员能预先清楚地知道将要发生的一切。如果用代码表述罪犯走近乔并刺伤了他,那么写成“罪犯走近乔并刺伤了他”最恰当了。该代码简短、清楚、并讲述了所发生的一切。但是由于某些原因,程序员拒绝写简捷清楚的代码,却极力主张使用具有技巧的、比较精炼的、异乎寻常的编码方法,最好不要这样。但是直观的代码并不意味着是简单的代码,直观的代码可以使你沿着一条明确无奇的路径从A点到达B点。必要的时候直观的代码可能也很复杂。因此,本章将考察导致产生不直观代码的编程风

3、格。例子都很巧妙、有技巧,但是并非显而易见,当然,这些程序都会引起一些微妙的错误。要注意到底引用了什么下面的代码是上一章所给的memchr的无错版本:void*memchr(void*pv,unsignedcharch,size_tsize){unsignedchar*pch=(unsignedchar*)pv;while(size-->0){if(*pcd==ch)return(pch);pch++;}return(NULL);}大多数程序员玩弄的一种游戏是“我如何使得代码更快?”的游戏。这并不是坏游戏,但是正如我

4、们从这本书所感到的那样:如果过份地热衷于这种游戏,那就是坏事。例如如果在上面的例子上玩这个游戏的话,你就会问自己:“如何使循环加快?”只有三种可能的途径:删除范围检查、删除字符测试、或删除指针递增,好象删除哪一步骤都不行,但是如果愿意放弃传统的编码方式并进行大胆尝试的话是可以删除的。看一下范围检查,之所以需要该检查仅仅是因为:当在存储器的头size个字节内没有找到要找的字符ch时,就要返回NULL。要删除该检查,只要简单地保证总可以找到ch字符就可以了。这可以通过下面的方法来实现:在被查找的存储区域后面的第一个字节上

5、存放字符ch。这样,若待查存储区域内无字符此时,就可以找到后存入的这个ch字符:void*memchr(void*pv,unsignedcharch,size_tsize){unsignedchar*pch=(unsignedchar*)pv;unsignedchar*pchPlant;unsignedcharchSave;/*pchPlant指向要被查寻的存储区域后面的第一个字节*将ch存储在pchPlant所指的字节内来保证memchr肯定能挂到Ch*/pchPlant=pch+size;chSave=*pchP

6、lant;*pchPlant=ch;while(*pch!=ch)pch++;*pchPlant=chSave;return((pch==pchPlant)?NULL:pch);}巧妙吗?正确吗?通过用ch覆盖pchPlant指向的字符,可以保证memchr总能找到ch,这样就可以删除范围检查,使循环的速度加倍。但是,这样坚挺、可靠吗?这个memchr的新版看上去似乎坚挺,特别是它还仔细地把pchPlant原来所指的要被覆盖的字符保存起来,但是memchr的这个版本还是有问题。对于初学者来讲,请考虑下面几点:l如果p

7、cPlant指向只读存储器,那么在*pchPlant处存放字符ch就不起作用,因此当在size+1范围内没有发现ch时,函数将返回无效指针。l如果pchPlant指向被映射到I/O的存储器,那么将ch存储在*pchPlant处就难以预计会发生什么事情,从使得软盘停止(或开始)工作到工业机器人狂暴地挥舞焊枪都有可能。l如果pch指向RAM最后的size个字节,pch和size都是合法的,但pchPlant将指向不存在的或是写保护的存储空间。将ch存储在*pchPlant处就可能会引起存储故障,或是不做任何动作。此时如果

8、在size+1个字符内没有找到宇符ch,函数就会失败。l如果pchPlant指向的是并行进程共享的数据,那么当一个进程在*pchPlant处存储ch时,就可能错改另一个进程要引用的存储空间。最后一点尤其会引起麻烦,因为有许多方式都可以引起系统瘫痪。如果你调用memchr来查寻已分配了的存储空间,却不料破坏了存储管理程序的某个数据结构,这将如何是

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。