2010-12-23 45 views
4
#include "stdafx.h" 
#include "iostream" 
#include "string" 

using namespace std; 

void main() 
{ 
string a = "a"; 
string b(1, -70); /*constructor, create a string having 1 character that its value is equal to -70*/ 
cout<<((b>a)?b:a); 
} 

//output on screen: b was printed, not a (!) 

なぜbの値はaの値よりも小さいですが? この状況を修正するにはどうすればよいですか?C++文字列の比較

+1

これは古いテキストブックから手に入りましたか? – silent

答えて

1

バイナリに相当する-70の値を1文字で表示します。

2

文字列は、実際の文字の意味にかかわらず、常にunsigned charと比較されます。 >だから、基本的には-70が186と186で127

「」

を -

std::stringchar範囲で-128の場合でもstrcmpのは0〜255の範囲内の文字を使用してCからこの行動を取りました

編集:標準への参照。私はC++ 0xの私の近くにC++ 2003分の98を持っていますが、ありません:、N2915、21.2.3.1、発言5 "プログラミング言語C++のためのワーキングドラフト、標準"

は言う:

2つの引数のメンバーeqとltは、unsigned char型の組み込み演算子==と<と同じように定義されます。

つまり、unsigned charとして比較される文字。 (これはcharの文字特性の特殊化を参照しています)

+0

私はそうすることができない標準の要件を見つける。 –

+0

@Martin York、私の編集を参照してください – Artyom

3

VS2010で、charが署名されていることがわかりました。 は比較にデバッガのステップ実行、私は最終的にコードを打つ:

template<> struct char_traits<char> 
{ // properties of a string or stream char element 
typedef char _Elem; 
typedef _Elem char_type; 
typedef int int_type; 
typedef streampos pos_type; 
typedef streamoff off_type; 
typedef _Mbstatet state_type; 

static int __CLRCALL_OR_CDECL compare(const _Elem *_First1, const _Elem *_First2, 
    size_t _Count) 
    { // compare [_First1, _First1 + _Count) with [_First2, ...) 
    return (_CSTD memcmp(_First1, _First2, _Count)); 
    } 
// etc 
}; 

だから、本当の比較ですがmemcmpに沸きます。それをチェックすると、「unsigned char値として評価される」ということがわかります。したがって、問題です。

Cf. Arytomの答え - 興味深い、私はこれを知らなかった。それを見てください:

char_traits州の1998年の標準21.1.3.1:6では、組み込みオペレータ<と同じように定義されています。

N3126ドラフト、21.2.3.1:5は、それがunsigned charの場合と同じであることを示しています。