我不明白爲什麼這個循環打印「無限」。如果字符串長度爲1,那麼length()-2
如何產生一個大整數?std :: string length()函數是如何工作的?
for(int i=0;i<s.length()-2;i++)
{
cout<<"INFINITE"<<endl;
}
我不明白爲什麼這個循環打印「無限」。如果字符串長度爲1,那麼length()-2
如何產生一個大整數?std :: string length()函數是如何工作的?
for(int i=0;i<s.length()-2;i++)
{
cout<<"INFINITE"<<endl;
}
std::string.length()
返回size_t
。這是一個無符號整數類型。您遇到整數溢出。在僞代碼:
0 - 1 = int.maxvalue
在你的情況具體地,它是:
(size_t)1 - 2 = SIZE_MAX
其中SIZE_MAX
通常等於2^32 - 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
您是否有任何「size_t」的來源可以是有符號的整數? – MFH
@MFH我不好。 18.2規定它將被簽名。 –
提示:長度不能爲負。因此,它不需要簽名。查看'size_t'的類型 – enhzflep
請寄出一個[MCVE] –
可能你有警告信息,但忽略它。 – i486