std :: string length()函数如何工作?

时间:2016-06-14 11:00:37

标签: c++ string loops

我无法理解为什么这个循环打印“INFINITE”。如果字符串长度为1,那么length()-2如何产生一个大整数?

for(int i=0;i<s.length()-2;i++)
{
    cout<<"INFINITE"<<endl;
}

2 个答案:

答案 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