No.111361 作者:cortex3564 邮件:3306607541@qq.com ID:133141 登陆:3次 文章数:14篇 最后登陆IP:119.139.116.150 最后登陆:2016/1/17 17:33:33 注册:2016/1/11 16:27:03 财富:170 发帖时间:2016/1/17 17:27:26 发贴者IP:119.139.116.150 标题:cortex3564:【深圳信盈达】每天学点C++知识:不要去做编译器的工作 摘要:No.111361【深圳信盈达】每天学点C++知识:不要去做编译器的工作 每天学点C++知识:不要去做编译器的工作 对于C++编程的老鸟来说,有时候他们喜欢把一些东西按照编译器的工作原理进行改写,以便提高代码的运行效率。这么做确实高明,也能体现出程序员的水平,但是这么做也是有风险的。因为有时候你可能会因为一些简单的笔误,而造成非常难以察觉的错误。本文就给出了类似的例子。 这个 Bug 出现在 MySQL 源代码中。 错误代码: static int rr_cmp(uchar *a,uchar *b) { if (a[0] != b[0]) return (int) a[0] - (int) b[0]; if (a[1] != b[1]) return (int) a[1] - (int) b[1]; if (a[2] != b[2]) return (int) a[2] - (int) b[2]; if (a[3] != b[3]) return (int) a[3] - (int) b[3]; if (a[4] != b[4]) return (int) a[4] - (int) b[4]; if (a[5] != b[5]) return (int) a[1] - (int) b[5]; < < < <==== if (a[6] != b[6]) return (int) a[6] - (int) b[6]; return (int) a[7] - (int) b[7]; } 说明: 这是一个在对代码段进行拷贝粘贴时出现的典型错误。程序员很可能是把“if (a[1] != b[1]) (int) a[1] – (int) b[1];” 这段代码拷贝了好几遍(然后手动改数组下标),用来实现一个循环。不过程序员忘记把其中某一行的数组下标 1 改成 5。结果就是函数有时候能返回正确的值(,有的时候则不行),这种错 ......
>>返回讨论的主题
|