#include <iostream>
int main() {
if ("zabc" < "def") {
std::cout << "Less.\n";
}
}
上記のコードはLess.
. char*
これがC++ で sを比較する正しい方法ではないことはわかっていますが、上記のコードはどのように出力されますLess.
か?
#include <iostream>
int main() {
if ("zabc" < "def") {
std::cout << "Less.\n";
}
}
上記のコードはLess.
. char*
これがC++ で sを比較する正しい方法ではないことはわかっていますが、上記のコードはどのように出力されますLess.
か?
このコードは、2 つの文字列のアドレスを比較します。正式には、それらは同じ配列の要素ではないため、これは特定されていない動作ですが、この場合はおそらく真実を語っています: 最初の文字列は 2 番目の文字列よりも低いアドレスを持っています。しかし、あなたはそれを当てにすることはできません...
アドレスを比較しているだけです。strcmpを使用する必要があります
これを行うと、コンパイラは2つのchar配列を割り当てます。1つは「def」用、もう1つは「zabc」用です。これはコンパイル時に行われます。
「zabc」は「def」の前に定義されているため、これは未定義の動作ですが、コンパイラはおそらく最初のアドレスに小さいアドレスを与えます。後でアドレスが比較されるとき、「zabc」は「小さい」です。次の手順を実行しても、「Less」が印刷されることがわかります。
if ("def" < "zabc") {
std::cout << "Less.\n";
}
アドレスを比較しています。「zabc」は、特定のコンパイラによってコンパイルされたこのコードの特定の呼び出しに対して、たまたま「def」よりも低いアドレスにあります。(コンパイラによっては、より高いアドレスにある可能性があり、同じ実行可能ファイルの異なる呼び出しであっても可能性があります。)