3

まず、次の例を考えてみましょう。

#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);
}

abは、辞書的比較では より小さいですが、こちらのa方が大きいです。s の比較はどのようにconst char*実装されますか?

4

4 に答える 4