C++ 为什么可以';t size\u不能直接与负int进行比较?
我的程序中有一个错误是直接将C++ 为什么可以';t size\u不能直接与负int进行比较?,c++,C++,我的程序中有一个错误是直接将size\u t与int进行比较造成的 玩具示例代码如下所示: string s = "AB"; cout << (-1 < 8888888+(int)s.size()) << endl; cout << (-1 < 8888888+s.size()) << endl; string s=“AB”; cout因为size\u t是无符号的,而int是有符号的。语言对于这种“混合”比较以及
size\u t
与int
进行比较造成的
玩具示例代码如下所示:
string s = "AB";
cout << (-1 < 8888888+(int)s.size()) << endl;
cout << (-1 < 8888888+s.size()) << endl;
string s=“AB”;
cout因为size\u t
是无符号的,而int
是有符号的。语言对于这种“混合”比较以及“混合”算术有特殊的规则。在这种情况下,这些规则规定所有内容都应转换为size\t
。转换为无符号的size\u t
,会极大地扭曲int
的原始值(-1
变成size\u MAX
),这就是第二种情况下导致“奇怪”结果的原因
在第一种情况下,您强制将size\u t
转换为int
,从而将比较变成int
与int
的比较。它以预期的方式运行
请注意,顺便说一句,std::string::size()
返回std::string::size\u type
,这是一种无符号类型,但不一定size\u t
size\u t是无符号的,因此只能表示正数。将其与负片进行比较会产生奇怪的结果
如果您尝试将int(-1)转换为size\t,您会发现它变成了一个巨大的数字,这解释了您的行为 size\u t
未签名。你怎么把它和负值比较呢?哦,我知道了!谢谢在有人生气之前,我会修改我的问题。:)很遗憾他们选择了这个方向。因为size\u t通常是一个小整数,所以不太令人惊讶的隐式强制转换应该是(有符号)size>-1,而不是size>(无符号)-1