我的计划中的一个错误是直接将size_t
与int
进行比较。
玩具样本代码如下:
string s = "AB";
cout << (-1 < 8888888+(int)s.size()) << endl;
cout << (-1 < 8888888+s.size()) << endl;
输出结果为:
1
0
那么为什么size_t不能直接与负int进行比较?
答案 0 :(得分:5)
size_t是无符号的,因此只能表示正数。将其与否定比较将产生古怪的结果。
如果你尝试将int(-1)转换为size_t,你会发现它变成了一个巨大的数字,这解释了你所拥有的行为。
答案 1 :(得分:1)
由于size_t
未签名且int
已签名。语言对这样的&#34;混合&#34;比较,以及&#34;混合&#34;算术。在这种情况下,这些规则规定所有内容都应转换为size_t
。转换为size_t
(未签名)会极大地扭曲int
的原始值(-1
变为SIZE_MAX
),这会导致&#34;奇怪&# 34;导致第二种情况。
在第一种情况下,您强行将size_t
转换为int
,从而将您的比较转换为int
与int
之一。它表现得很好。
请注意,顺便说一句,std::string::size()
返回std::string::size_type
,这是一种无符号类型,但不一定是size_t
。