实战经验:避免在组件接口中使用unsigned
作者:BlogUpdater |
时间:2018-07-15 |
浏览:2322 |
评论已关闭 条评论
示例代码
=====================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 12月11日
- 一则历史:为什么网络路径前加一个盘符还能正常工作
- Posted on 05月26日
- 第 295 期:微软在 Windows 11 更新标题中恢复日期显示
- Posted on 11月06日
- 实战经验:避免在组件接口中使用unsigned
- Posted on 07月15日



评论已关闭。