なぜb [2]は偽ですか?


11
string s;
bool b[] = {s=="",  s==s.c_str(),  s.c_str()==""};

セット

b[] = {true, true, false};

なぜb[2]間違っているのですか?

との場合A==BA==Cそれは意味しませんB==Cか?



私は今、自分の間違いを見つけて、ポインタを比較するのを混乱させたのはこれが初めてではないので、デジャヴの感覚を持っています。
NoComprende

回答:


14

この表現では

s.c_str()==""

2つのポインタ(アドレス)が比較されます。最初s.c_str()の文字列はによって返されるポインタで、2番目の文字列は文字列リテラルの最初の文字(終端文字がゼロ文字)へのポインタ""です。

アドレスが異なることは明らかです(文字列リテラルには静的な保存期間があることも覚えておいてください)。

期待される結果を得るには、代わりに書く必要があります

std::strcmp( s.c_str(), "" ) == 0

これら二つの表現は

s==""

そして

s==s.c_str()

標準クラスstd :: stringには右のオペランドにオーバーロードされた演算子==があるため、比較された文字列があります。


最後のケースでは、規格はポインタが異なることを保証しますか?彼らはそうすることができることを理解しています。
ジェフリー

UBであることだけを追加できます。「文字列リテラルとの比較により、特定されていない動作が発生する」
Roout

@Jeffrey少なくとも文字列が空であるため、保証されます。:)しかし、いずれの場合でも、クラスstd :: stringは、コンストラクタの引数のコピーを使用します。
1919

1
@Roout-「UB」は未定義の動作を意味します。これは、言語定義が**プログラムの動作を教えてくれないことを意味します。未定義の動作を持つプログラムは有効なC ++プログラムではありません。「未指定の動作」はそこにいくつかの選択肢があり、標準プログラムが有効で選択されますそれらのどのあなたを教えてくれない、と実装は選択肢のいずれかを選択することができます。。
ピート・ベッカー

@PeteBecker UBを含むプログラムは、まだ有効なC ++プログラムです(少なくとも、正常にコンパイルして実行できるという意味で)。
trolley813
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.