このループが "INFINITE"を印刷する理由を理解できません。文字列の長さが1の場合、length()-2
はどのように大きな整数になりますか?std :: string length()関数はどのように機能しますか?
size_t
を返し
std::string.length()
for(int i=0;i<s.length()-2;i++)
{
cout<<"INFINITE"<<endl;
}
このループが "INFINITE"を印刷する理由を理解できません。文字列の長さが1の場合、length()-2
はどのように大きな整数になりますか?std :: string length()関数はどのように機能しますか?
size_t
を返し
std::string.length()
for(int i=0;i<s.length()-2;i++)
{
cout<<"INFINITE"<<endl;
}
。これは符号なし整数型です。整数のオーバーフローが発生しています。擬似コードでは:お使いの場合には
0 - 1 = int.maxvalue
は、具体的には、次のとおりです。SIZE_MAX
は通常2^32等しい
(size_t)1 - 2 = SIZE_MAX
から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;
}
リンゴのx64の場合:
unsigned : true
size : 64 bits
npos : ffffffffffffffff
符号付き整数が許される 'size_t' beeingのソースはありますか? – MFH
@MFH私の悪い。 18.2は、それが署名されないことを要求する。 –
ヒント:長さが負にすることはできません。したがって、署名する必要はありません。 'size_t'のタイプを調べてください – enhzflep
[MCVE] –
を投稿してください。恐らく警告メッセージが表示されますが、無視してください。 – i486