Zhang Jiuan’ Notes

strlen的i++与++i的细节

  无意间在网上看到如下strlen的实现:
int strlen(const char *str)
{
    register const char *p = str;
    while (*p++) ;
    return p - str;
}
程序倒显的挺简洁,但仔细想了一下是存在bug的。
1 没有对输入进行合法性验证
2 计算的长度也比字符串的实际长度多1。
于是当时想到改成++p会修正上述的第2点,第1点在此不作讨论。
int strlen(const char *str)
{
    register const char *p = str;
    while (*++p) ;
    return p - str;
}
在一般情况这个子程是可以工作的,效率也可以,但它仍存在bug,那就是字符串长度为0。
接口设计处理,实现仍旧是硬道理,特别是循环和++ –的地方犹其需要注意。
自测过程中,边界、极限测试也是十分必要的。
If you enjoyed this post, make sure you subscribe to my RSS feed!

c++ primer读书笔记

    现在再次读c++primer,感觉还是有很多东西值得学习,现在把一些经典句子摘抄下来。
    实际上在许多实际开发环境中成功的主要评价标准是最后的结果,至于对处理过程的讨论则很可能被视为学究气不切实际,总是得不到重视。虽然这种蛮力型的方案也能解决问题但是它总让人感到不快,而且有些危机感。这种方案吸引人的地方就是简单,我们明白需要做什么虽然它常常很乏味。
    复杂的技术方案一般在开始阶段需要很多时间,这时常常会感觉什么都没有做。而且因为处理过程是自动的,所以就更有可能出错事情不可避免会出错。但好处在于这些错误过程中不但事情很快能完成,而且拓展了想像的空间有时候这个过程也挺有趣的。
    每个指针都有一个相关的类型,不同数据类型的指针之间的区别不是在指针的表示上,也不在指针所持有的值地址上。——对所有类型的指针这两方面都是相同的。不同之处在于指针所指的对象的类型上,指针的类型可以指示编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元。
If you enjoyed this post, make sure you subscribe to my RSS feed!

,

返回顶部