在我的程序一个错误是通过直接比较引起size_t与int.
玩具示例代码如下:
string s = "AB";
cout << (-1 < 8888888+(int)s.size()) << endl;
cout << (-1 < 8888888+s.size()) << endl;
Run Code Online (Sandbox Code Playgroud)
输出是:
1
0
那么为什么size_t不能直接与负int进行比较呢?
size_t是无符号的,因此只能表示正数.将其与否定比较将产生古怪的结果.
如果你尝试将int(-1)转换为size_t,你会发现它变成了一个巨大的数字,这解释了你所拥有的行为.
因为size_t是未签名的和int已签名的。语言对于这种“混合”比较以及“混合”算术有特殊的规则。在这种情况下,这些规则规定所有内容都应该转换为size_t. 转换为无符号的 ,会极大地size_t扭曲 的原始值(变成),这就是在第二种情况下导致“奇怪”结果的原因。int-1SIZE_MAX
在第一种情况下,您强制转换size_t为int,从而将您的比较变成intvs. intone 。它的行为符合预期。
请注意,顺便说一句,它std::string::size()返回std::string::size_type,这是一个无符号类型,但不一定是size_t。
| 归档时间: |
|
| 查看次数: |
2145 次 |
| 最近记录: |