2012-03-23 23 views
3
cout << boolalpha ("1" < "0") << endl; 

私がやっていたいくつかのコースの仕事からスピンオフとしてこれを最近コンパイルしていました。私はそれを実行するとなぜtrueが生成されますか?C++のライン出力

cout << boolalpha (string("1") < string("0")) << endl; 

期待通りに比較します。

+2

あなたは何を生産すると思いましたか、なぜですか? –

+0

ようこそスタックオーバーフロー! "...これは真実を生み出す...期待通りの比較をする。"それは面白い。 C++では、 'std :: boolalpha' [' bool'をパラメータとしていないので、両方のプログラムフラグメントが構文エラーを生成します(http://ideone.com/Js1YC)(http://en.cppreference .com/w/cpp/io/manip/boolalpha)。コードをメモリからポストしないでください。あなたのコードのエラーはあなたのポストの質問を損なうでしょう。あなたのプログラムからあなたのコードをあなたの質問に直接コピー&ペーストしてください。 –

答えて

3

それはconst char*を比較しています2 std::string秒の比較が定義されており、その場合のあなたの出力が期待される一方で、"1""0"の結果は、標準で定義されていません。ポイントで

クイックケース:

char* y = "0"; 
char* x = "1"; 
std::cout << (x<y) << endl; 
    //output 1 on my platform 

char* x = "1"; 
char* y = "0"; 
std::cout << (x<y) << endl; 
    //output 0 on my platform 

標準的なルールはありませんので、私はどこに(それはコンパイラのルールすることができます)、「私のプラットフォーム上」を指定していますポインタが作成されます。

私の場合、アドレスは宣言の逆の順序で割り当てられます。

私はあなたが実行した場合ことを賭けて喜ん:

cout << ("1" < "0") << endl; 

cout << ("0" < "1") << endl; 

を(それはルールではありませんが)あなたが同じ出力を得ると思います。プログラムの異なるインスタンスで実行する必要があることに注意してください。同じインスタンスでそれらを実行すると、メモリ内の単一の場所に文字列リテラルが存在するため、結果が異なる可能性があります。

+0

私は 'boolapha(" 1 "<" 0 ")'がコンパイルされないことを賭けています。 –

+0

@Robᵩ多分彼のコンパイラは標準に準拠していません。私のために、コンパイルもしていないので、私のコードスニペットでは私はboolalphaを使用しませんでした。 –

+0

申し訳ありませんが、コピーエラーが発生しました:cout << boolalpha <<( "0" <"1")<< endl;私も試しました:cout << boolalpha <<( "1" <"0")<< endl;同じ結果を得た –

3

表現 "1" < "0"は2つのポインタの値を比較します。 1つは文字シーケンス "1"を指し、もう1つは文字シーケンスを指します。あなたのコンパイラは、文字列 "1"のアドレスが "0"のアドレスよりも前になるように文字列をメモリに配置しました。

ただし、文字列では、演算子<(const string &、const string &)が期待通りに呼び出されます。

1

次の2つのポインタを比較しているので(ストリング"1""0"は同義(ちょっと)char型へのポインタと、charの配列として表されます)。数字0と1の比較をしたい場合は、引用符は必要ありません。それ以外の場合は、文字列の内容を比較する文字列比較関数が必要です。 std::stringにラップし、compare()メンバ関数を使用する場合に最適です。