文字列ではなくポインタ値を比較しています(注:"cose"
は"code"
とは異なるリテラルであり、異なるポインタを与えることを保証しています)。
<string>
ヘッダーのstd::string
を使用すると、意味のある文字列操作が得られます。
次に、"code"s
のようなリテラルを使用することもできます。正式
#include <iostream>
#include <string>
using namespace std;
auto main() -> int
{
cout << boolalpha;
cout << ("t"s < "c"s) << endl;
cout << ("c"s < "t"s) << endl;
cout << ("code"s < "test"s) << endl;
cout << ("test"s < "cose"s) << endl;
}
問題のコード、
cout<<("t"<"c")<<endl;
cout<<("c"<"t")<<endl;
cout<<("code"<"test")<<endl;
cout<<("test"<"cose")<<endl;
&hellip;同じタイプの点の二つのポインタp
とq
の場合
”:実装定義された挙動を有し、なぜなら
C++ 11§5.9/ 2 2 NDダッシュ(expr.rel)同じオブジェクトまたは同じ配列の要素または異なる機能のメンバーではない異なるオブジェクト、またはそのうちの1つだけがnullの場合、p<q
,p>q
,p<=q
およびp>=q
の結果は不定です。
ため
C++ 11 20.8.5/8(比較)ただし、std::less
と家族を経由して、明確に定義された方法で、このようなポインタを比較することができます:
”をテンプレートgreater
,less
,greater_equal
およびless_equal
の場合、組み込み演算子<
,>
,<=
、>=
はありません。
しかし、ポインタの比較はいくつかの状況では役に立ちますが、おそらく文字列リテラルを比較したかったでしょう。標準ライブラリは、例えば、 strcmp
これを行うには。しかし、最初に述べたように、std::string
を使用することをお勧めします。
リテラル"code"
はchar
数値の不変ヌルで終了する文字列です。最後のヌルバイトでは合計で5つのchar
の値になります。従ってタイプはchar const[5]
です。
ポインタが期待される文脈で使用される式として、この配列(すなわち、"code"
リテラル)を表す式は、最初の項目であるchar const*
ポインタへのポインタに減衰します。
これはポインタへの配列式の通常の減衰ですが、C++ 03以前では、崩壊をただちにchar*
(no const
)にする特別なルールもありました。
注:
2つの同一の文字列リテラルを使用するコンパイラやオプションに応じて、異なるポインタ、または同じポインタを与えることができます¹。
"文字列リテラルを使用すると、最初の文字へのポインタが得られます。"これはしばしば真実ですが、一般的にはそうではありません。 –