我无法理解为什么这个循环打印“INFINITE”。如果字符串长度为1,那么length()-2
如何产生一个大整数?
for(int i=0;i<s.length()-2;i++)
{
cout<<"INFINITE"<<endl;
}
答案 0 :(得分:5)
std::string.length()
返回size_t
。这是无符号整数类型。您正在经历整数溢出。在伪代码中:
0 - 1 = int.maxvalue
在你的情况下具体是:
(size_t)1 - 2 = SIZE_MAX
其中SIZE_MAX
通常等于2 ^ 32 - 1
答案 1 :(得分:1)
std::string::length()
返回std::string::size_type
。
std::string::size_type
被指定为与allocator_traits<>::size_type
(字符串的分配器)相同的类型。
这被指定为无符号类型。
因此,该数字将包装(定义行为)并变得巨大。确切地说,巨大程度取决于架构。
您可以使用这个小程序在您的架构上进行测试:
#include <limits>
#include <iostream>
#include <string>
#include <utility>
#include <iomanip>
int main() {
using size_type = std::string::size_type;
std::cout << "unsigned : " << std::boolalpha << std::is_unsigned<size_type>::value << std::endl;
std::cout << "size : " << std::numeric_limits<size_type>::digits << " bits" << std::endl;
std::cout << "npos : " << std::hex << std::string::npos << std::endl;
}
在apple x64的情况下:
unsigned : true
size : 64 bits
npos : ffffffffffffffff