2016-06-14 31 views
0

我不明白爲什麼這個循環打印「無限」。如果字符串長度爲1,那麼length()-2如何產生一個大整數?std :: string length()函數是如何工作的?

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

提示:長度不能爲負。因此,它不需要簽名。查看'size_t'的類型 – enhzflep

+0

請寄出一個[MCVE] –

+0

可能你有警告信息,但忽略它。 – i486

回答

5

std::string.length()返回size_t。這是一個無符號整數類型。您遇到整數溢出。在僞代碼:

0 - 1 = int.maxvalue 

在你的情況具體地,它是:

(size_t)1 - 2 = SIZE_MAX 

其中SIZE_MAX通常等於2^32 - 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; 
} 

蘋果64的情況下:

unsigned : true 
size  : 64 bits 
npos  : ffffffffffffffff 
+2

您是否有任何「size_t」的來源可以是有符號的整數? – MFH

+0

@MFH我不好。 18.2規定它將被簽名。 –

相關問題