A “bug”

2012年9月24日 19:06

今天在做codeforces 223B http://codeforces.com/problemset/problem/223/B 的时候遇到一个很隐蔽的“bug”,欣喜之余,把它记录下来。

把遇到的问题提取出来,就是下面这段代码:

#include <iostream>
#include <string>

int main()
{
	std::string str("abc");
	if(-1 < str.length()) {
		std::cout << "Yes" << std::endl;
	} else {
		std::cout << "No" << std::endl;
	}
	return 0;
}

这段代码的输出是Yes还是No呢?

表面上看,str.length()应该是3;-1小于3是true,那么应该输出Yes。

然而你编译运行下这段代码就会发现,它输出的并不是Yes,而是No,为什么呢?

我们看一下str.length()返回的是什么。众所周知,str.length()返回字符串的长度 ,然而关注返回值类型的人比较少,它的类型是size_t,在cstddef中,size_t定义为unsigned int。-1的类型是int,在int和unsigned比较前需要将数据类型提升一致。于是就把-1转化成unsigned类型,而-1在内存中存储为0xffffffff(32位),于是unsigned(-1)=0xffffffff=232-1了,那么表达式232-1<3必然为false,于是输出No