まず、次の例を考えてみましょう。
#include <iostream>
using namespace std;
int main()
{
cout << ("123" == "123");
}
私は何を期待していますか:「123」は であるため、これらの文字列のconst char*
アドレス(これらの回答の1つが言ったように)が比較されることを期待しています。
...
!=
and==
は、これらの文字列のベースアドレスのみを比較するためです。文字列自体の内容ではありません。
しかし、それでも出力は1
. わかりました、2 つの prvalue オブジェクトのアドレスを比較する方法が実際にはわかりません (または、少なくともどのように行われるかわかりません)。これらの文字列を変数として宣言して、何が起こるか見てみましょう。
#include <iostream>
using namespace std;
int main()
{
const char* a = "1230";
const char* b = "1230";
cout << (a == b);
}
それでも出力は1
. const char*
弦は腐らないのですか?または、コンパイラはいくつかの最適化を行い、1 つの文字列のみにメモリを割り当てることができましたか? では、それらを回避してみましょう:
#include <iostream>
using namespace std;
int main()
{
const char* a = "1230";
const char* b = "1231";
b = "1230";
cout << (a == b);
}
それでも結果は同じです。const char*
それは本当に腐らないと思いました。しかし、それは私の人生をより単純にしませんでした。では、s はどのようにconst char*
比較されるのでしょうか。
なぜここに出力があるのですか1
:
#include <iostream>
using namespace std;
int main()
{
const char* a = "1230";
const char* b = "1231";
cout << (a > b);
}
a
b
は、辞書的比較では より小さいですが、こちらのa
方が大きいです。s の比較はどのようにconst char*
実装されますか?