C++小知识:复制粘贴代码千万要小心

错误代码:

sampleCount VoiceKey::OnBackward (....) {
 ...
 int atrend = sgn(buffer[samplesleft - 2]-
          buffer[samplesleft - 1]);
 int ztrend = sgn(buffer[samplesleft - WindowSizeInt-2]-
          buffer[samplesleft - WindowSizeInt-2]);
 ...
}

解释:

buffer[samplesleft – WindowSizeInt-2]” 该表达式是减去其自身。这个错误是由于复制粘贴代码引起的,该程序员复制了一行代码,却忘记把 2 改为 1 了。

正确的代码:

int ztrend = sgn(buffer[samplesleft - WindowSizeInt-2]-
         buffer[samplesleft - WindowSizeInt-1]);

建议:

复制粘贴代码时千万要小心。

不建议大家拒绝使用复制粘贴的方法,毕竟它确实很有用,使用起来太方便了。但用的时候千万要小心,不要着急。

俗话说有备无患。记住复制粘贴代码可能会导致大量的错误。看看这些通过 V501 诊断发现 bug 的例子中,有一半的错误都是由于使用复制粘贴方法导致的,另外一半是因为拼写错误。当然关于这个话题,我们另一篇文章专门写到它。

当你复制代码并进行修改的时候,时刻要记得检查你是否完全做对了!千万别偷懒!

另外,我们还会讨论更多关于复制粘贴的话题,我打赌你还没意识到这个问题影响的范围有多广,但是我保证会让你印象深刻。C++小知识:复制粘贴代码千万要小心

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • C++小知识:大于0并不意味着等于1

    注:本文所指出的错误例子其实非常简单,任何 C++ 的初学者都能看懂.但是这个错误也非常典型,估计很多非常严肃的代码里面都存在这样的错误. 这个 Bug 是来自于 CoreCLR 源代码. 错误代码: bool operator( )(const GUID& _Key1, const GUID& _Key2) const { return memcmp(&_Key1, &_Key2, sizeof(GUID)) == -1; } 解释: 你不能将 memcpy().strc

  • 深度剖析C++对象池自动回收技术实现

    对象池可以显著提高性能,如果一个对象的创建非常耗时或非常昂贵,频繁去创建的话会非常低效.对象池通过对象复用的方式来避免重复创建对象,它会事先创建一定数量的对象放到池中,当用户需要创建对象的时候,直接从对象池中获取即可,用完对象之后再放回到对象池中,以便复用.这种方式避免了重复创建耗时或耗资源的大对象,大幅提高了程序性能.本文将探讨对象池的技术特性以及源码实现. 对象池类图 ObjectPool:管理对象实例的pool. Client:使用者. 适用性: 类的实例可重用. 类的实例化过程开销较大.

  • 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[

  • C++小知识:尽可能使用枚举类

    静态代码分析工具可简化编码过程,检测出错误并帮助修复.PVS-Studio 是一个用于 C/C++ 的静态代码分析工具.该团队检测了 200 多个 C/C++ 开源项目,包括了 Unreal Engine.Php.Haiku.Qt 和 Linux 内核等知名项目. 下面这个 Bug 是在 Source SDK 的源代码中发现的. 错误代码: 这种错误的例子代码量都非常大,我尽可能地选取其中最小的一部分,但是很抱歉,代码看起来依旧很冗长. enum PhysGunPickup_t { PICKED

  • Lua和C/C++互相调用实例分析

    lua作为小巧精悍的脚本语言,易于嵌入c/c++中 , 广泛应用于游戏AI ,实际上在任何经常变化的逻辑上都可以使用lua实现,配合c/c++实现的底层接口服务,能够大大降低系统的维护成本.下面对lua和c/c++的交互调用做一个实例分析: lua提供了API用于在c/c++中构造lua的运行环境,相关接口如下: //创建lua运行上下文 lua_State* luaL_newstate(void) ; //加载lua脚本文件 int luaL_loadfile(lua_State *L, co

  • C++线程安全的单例模式讲解

    废话不多说,常用的代码积淀下来. 一.懒汉模式 即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例. 需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety. 使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈. 1.静态成员实例的懒汉模式: class Singleton { private: static Singleton* m_instanc

  • C++小知识:用合适的工具来分析你的代码

    静态代码分析工具可简化编码过程,检测出错误并帮助修复.有个国外团队检测了 200 多个 C/C++ 开源项目,包括了 Php.Qt 和 Linux 内核等知名项目.于是他们每天分享一个错误案例,并给出相应建议.今天的案例来自 LibreOffice 项目. 错误代码 BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) { .... CreateThread( NULL, 0, ParentM

  • C++小知识:用++i替代i++

    静态代码分析工具可简化编码过程,检测出错误并帮助修复.PVS-Studio 是一个用于 C/C++ 的静态代码分析工具.该团队检测了 200 多个 C/C++ 开源项目,包括了 Unreal Engine.Php.Haiku.Qt 和 Linux 内核等知名项目.于是他们每天分享一个错误案例,并给出相应建议. 这个 bug 是在 Unreal Engine 4 的源代码中发现的. 错误代码: void FSlateNotificationManager::GetWindows( TArray<

  • C++小知识:C/C++中不要按值传递数组

    错误的代码: ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) { memcpy( mat, src, sizeof( src ) ); } 说明: 有时候程序员会忘记 C/C++ 里数组不能按值传递给函数.当你试图这样做时,是数组的指针(第一个元素的地址)而不是整个数组被传递.我们还应该记住,方括号中的数字没有任何意义.它们仅仅是程序员所做的标志,记录了传递数组的『假定』大小.事实上,你也可以传递一个大小完全不同的数组.例如,下面的代码就会成功编译

  • C++小知识:不要节约代码行数

    本篇案例来自 KDE4 源码. 错误代码: void LDAPProtocol::del( const KUrl &_url, bool ) { .... if ( (id = mOp.del( usrc.dn() ) == -1) ) { LDAPErr(); return; } ret = mOp.waitForResult( id, -1 ); .... } 说明: 一些程序员竭尽全力想把更多的代码压缩到一行.他们尤其热衷于"if"条件语句,把赋值和比较一次性完成. 一个

随机推荐