实战经验:避免在组件接口中使用unsigned

实战经验:避免在组件接口中使用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类型,可以最大限度阻止这种编译器隐式转换。

标签:

评论已关闭。