实战经验:避免在组件接口中使用unsigned
作者:BlogUpdater |
时间:2018-07-15 |
浏览:1929 |
评论已关闭 条评论
示例代码
=====================MyList.h===================== #pragma once #include <windows.h> class CMyList { public: CMyList(void) {} ~CMyList(void) {} public: UINT GetSize1() const {return 10;} int GetSize2() const {return 10;} };
=====================Main.cpp===================== #include "stdafx.h" #include "MyList.h" int _tmain(int argc, _TCHAR* argv[]) { CMyList myList; if (myList.GetSize1() > -1) { printf("10 > -1\n"); } else { printf("10 <= -1\n"); } if (myList.GetSize2() > -1) { printf("10 > -1\n"); } else { printf("10 <= -1\n"); } getchar(); return 0; }
编译执行,结果如下:
我们看到一个现象,两个方法,GetSize1和GetSize2都返回正整数10,但是,和-1对比的结果却是不一样的。
代码解析
在if表达式中,GetSize1返回了一个unsigned int,在和-1进行比较时,-1会被隐式转换为一个无符号数,也即 -1 => 2(32)(32为上标,即2的32次方) -1 => 4294967295,所以if表达式任务GetSize1() > -1 为 FALSE,虽然我们直觉上认为:10 > -1 肯定返回 TRUE。
结论
当表达式中同时存在无符号和有符号的整数时,编译器会悄悄将有符号的数转为无符号数,导致一些意想不到的情况发生,从而增加了我们的调试复杂度。所以,避免在对外接口方法中使用unsigned类型,可以最大限度阻止这种编译器隐式转换。
如需转载,请注明来自:拓扑梅尔智慧办公平台 | TopomelBox 官方站点
- 下一篇: 深度理解:#pragma once防止文件重复包含
- 上一篇: 深度理解:类前置声明的使用
相关推荐
- 说说以管理员身份执行的命令行的细节
- Posted on 04月29日
- Deleaker专题:未调用CloseHandle导致的线程句柄泄漏问题
- Posted on 09月24日
- 使用IntelliCode轻松进行代码重构
- Posted on 09月08日
- 错误信息: ppsjy:[MyHookProc]__read web cfg: success
- Posted on 07月29日
评论已关闭。