当前位置: 查字典图书网> 编程> 系统程序员成长计划> 这本书不是我的茶

这本书不是我的茶

对“这本书不是我的茶”的回应

泊泉 2010-08-20 00:26:35

我也倾向于书上的,其实assert用来表示绝对不可能发生的事没错,不过有的时候,我们在软件发行的时候也不敢拍着胸脯打包票说,“嗯,我们已经测试过了,这里绝对不会出现这样的情况”,所以为了保证程序的正确运行,最好还是加上错误处理,而assert则是帮我们在开发测试阶段即使发现那些导致不应该不可能的情况

[已注销] 2010-05-06 16:25:30

嗯,我觉得不应该再加检查,我的理解是assert和if (...) {...}这样的检查不能并存。

只有malloc这样的情形才可以用if (...) {...} 来检查

broncho 2010-05-06 10:13:55

”使用断言来断言关于代码结构的条件式,而不要断言关于运行期行为的条件式“ 呵,坦白的说,我看不懂这句话。
你是说书中不该调用assert,还是说assert后面不应该再加一个检查?
malloc的返回值,是可能为空的,当然不能用assert来检查。但assert(thiz != NULL);是对函数参数的检查,是检查不应该出现的情况,为什么不能用?

[已注销] 2010-05-05 19:33:01

感谢作者亲自的回应。

我对断言使用的认识最早来自<Imperfect C++>的1.4节,中文版p21的建议”使用断言来断言关于代码结构的条件式,而不要断言关于运行期行为的条件式“。

回到你书上的例子,assert(thiz != NULL);我觉得这里就不应该有运行时检查,除非你认为thiz == NULL这种情况是运行时可能出现的,比如下面这种情况。
thiz = malloc(...);
if (thiz == NULL) // 这里就不能用assert了
return ErrorCode;
assert的理念就是,发生了不可能发生的事,那么就让程序崩掉。我认为这种情况下让自动测试停止也是情有可原的。assert我觉得并没有相像的那么有用,所以你后面也弃用了assert。同样,assert也不是异常的替代,只是种调试机制,C中可以用setjmp和longjmp来实现异常机制,可以参考《c接口设计与实现》和lua的源代码。

broncho 2010-05-05 10:43:32

呵,先谢谢你非常中肯的意见。
p45: 对于assert的使用,我偏向于保留书上的意见。
p57:这个确实是考虑问题角度不同,我说的额外的空间是指用来存放数据本身的空间,这没有在书中说清楚,希望以后有机后改正。
p75:这是错误,在这次重印中已经修改了。
else {}的问题确实不应该,当时只考虑了如何把原理讲清楚,没有往这方面想。
至于排版的问题,都我怪了,第一次出书,我不知道编辑对代码排版一无所知,结果搞成这个样子。在这次重印做了一些修改,比第一次印刷好很多(仍然有些问题)。
你方便的话,等重印版出来,寄一本新书给你吧。
再次感谢!
已知错误请参考:http://code.google.com/p/spexamples/issues/list

《系统程序员成长计划》热门书评


书名: 系统程序员成长计划
作者: 李先静
出版社: 人民邮电出版社
出版年: 2010-04
页数: 272
定价: 45.00
装帧: 平装
丛书: 图灵程序设计丛书
ISBN: 9787115224019