翻译《有关编程、重构及其他的终极问题?》——3.复制一次,检查两次
2016-11-20 21:45
253 查看
翻译《有关编程、重构及其他的终极问题?》——3.复制一次,检查两次
标签(空格分隔): 翻译 技术 C/C++作者:Andrey Karpov
翻译者:顾笑群 - Rafael Gu
校验者:高国栋
最后更新:2016年11月20日
本书背景说明、总目录等介绍,可以跳转到以下链接进行查看:
http://blog.csdn.net/headman/article/details/53045891
欢迎大家转载,但请附上原作者以及翻译者的名字、原文出处,以尊重光荣的劳动者。
3.复制一次,检查两次
下面这段代码来自Audacity项目。PVS-Studio诊断后发现了错误:V501 There are identical sub-expressions to the left and to the right of the ‘-’ operator.(译者注:ztrend的赋值表达式sng中的见好两侧的值是一样的)sampleCount VoiceKey::OnBackward(....) { ... int atrend = sgn(buffer[samplesleft - 2] - buffer[smaplesleft - 1]); int ztrend = sgn(buffer[samplesleft - WindowSizeInt - 2] - buffer[samplesleft - WindowSizeInt - 2]); ... }
解释
“buffer[smaplesleft - WindowSizeInt - 2]”在表达式中自己减去自己。这个错误的出现是因为代码的拷贝问题(赋值-黏贴):这位程序员拷贝了一段代码,并且黏贴到后面,中间加了减号,却忘了把后面的2替换成1。
这是一个真的很平常的错误,但确实是因为失误所造成的。类似的错误对于程序员来说是非常具有现实讽刺性的(译者注:很多编译器很可能不报错,这个错误也很难被发现),这就是为什么我在这里说过几次的原因(译者注:#1的问题也有些类似)。我要想向这类的问题宣战。
正确的代码
int ztrend = sgn(buffer[samplesleft - WindowSizeInt - 2] - buffer[samplesleft - WindowSizeInt - 1]);
建议
在复制代码使用的时候,要十分小心。
如果因为这个错误而建议禁止所有的方法的复制-黏贴是没有意义的,复制-黏贴太方便和高效了,应为太有用了,所以你看没有任何编辑器把这个功能去除掉。
但只要小心,不要太慌张就不会有这个错误——凡事预则立。
记住,使用复制的代码可能引起很多错误。这里,如果你看下所有被PSV-Studio诊断为V501的错误,你会发现一半都是因为使用复制-黏贴而导致。
如果你使用了复制的代码并编辑了他们,请一定仔细检查,不要偷懒!
我们将会在后面讲更多复制-黏贴的错误。虽然这个问题看上去很简单,但真的藏的很深,很难发现(译者注:编译器不报错,需要程序员仔细review代码或者debug代码才能发现),所以我不会让你忘掉它(译者注:作者在后面还会不断的啰嗦这个问题)。
相关文章推荐
- 翻译《有关编程、重构及其他的终极问题?》——21.正确的检查文件的结尾符(EOF)
- 翻译《有关编程、重构及其他的终极问题?》——20.光对文件做EOF检查可能还不够
- 翻译《有关编程、重构及其他的终极问题?》——6.当把一个指针明确的转换为整型时,请检查所有相关代码
- 翻译《有关编程、重构及其他的终极问题?》——27.狡猾的BSTR字符串
- 翻译《有关编程、重构及其他的终极问题?》——前言
- 翻译《有关编程、重构及其他的终极问题?》——19.如何合理的从一个构造函数中调用另外一个构造函数
- 翻译《有关编程、重构及其他的终极问题?》——7.不要在循环中调用alloca()函数
- 翻译《有关编程、重构及其他的终极问题?》——11.不要试图把尽量多的操作符放到一行代码里
- 翻译《有关编程、重构及其他的终极问题?》——2.比0大的并不意味着就只是1
- 翻译《有关编程、重构及其他的终极问题?》——23.自动获取字符串的长度
- 翻译《有关编程、重构及其他的终极问题?》——14.一个好的编译器和代码风格还不够
- 翻译《有关编程、重构及其他的终极问题?》——18.你在一个语言上积累的经验和知识不总是适用于另外一门语言
- 翻译《有关编程、重构及其他的终极问题?》——29.在迭代器上请使用前置自增操作符(++i),不要使用后置自增操作符(i++)
- 翻译《有关编程、重构及其他的终极问题?》——28.如果你可以使用简单的函数就不要使用宏
- 翻译《有关编程、重构及其他的终极问题?》——24.override和final关键字应该成为你的新朋友
- 翻译《有关编程、重构及其他的终极问题?》——17.使用专门的函数清除专有数据
- 翻译《有关编程、重构及其他的终极问题?》——5.使用工具去分析你的代码
- 翻译《有关编程、重构及其他的终极问题?》——4.小心--操作符,请把表达式放在括号中
- 翻译《有关编程、重构及其他的终极问题?》——9.使用'-0'符号作为结尾标记
- 翻译《有关编程、重构及其他的终极问题?》——10.避免使用多个小的#ifdef块