1

このコードに問題がありますが、原因がわかりません。

bool Parser::validateName(std::string name) {
    int pos = name.find(INVALID_CHARS);               //pos is -1, 
    bool result = ((name.find(INVALID_CHARS)) < 0);   //result is false
    //That was weird, does that imply that -1 >= 0?, let's see
    result = (pos < 0)                                //result is true
    result = ((name.find(INVALID_CHARS)) == -1)       //result is true
    result = (-1 < 0)                                 //result is true
    ...
}

2行目の結果がfalseであるのはなぜですか。見えないものはありますか?

4

2 に答える 2

9

std::string::find実装定義の符号なし整数であると定義されているstd::string::nposタイプのものを返します。std::string::size_type符号なし整数が より小さいことはありません0

何かが見つかったstd::string::nposかどうかを確認するには、常に比較する必要があります。std::string::find

于 2012-12-13T15:54:27.087 に答える
2

std::string::findstd::string::npos要求されたアイテムが見つからない場合に戻ります。規格(§21.4/ 5)によると:

static const size_type npos = -1;

しかし、それstring::size_typeは通常unsigned intです; これは、それ-1が署名されていない同等のものに変換されることを意味します。通常、0xFFFFは、の最大値ですunsigned int

2行目:

bool result = ((name.find(INVALID_CHARS)) < 0);

2つの値(0xFFFFと0)を比較しているunsigned intので、これはを返しますfalse。一方、4行目:

result = ((name.find(INVALID_CHARS)) == -1)

とがありunsigned intintプロモーションルールが適用され、は;unsigned intに変換されます。int前に見たように、の符号付き等価nposは常に-1であるため、これはを返しますtrue

于 2012-12-13T16:04:11.947 に答える