"a" == "a"
Dieser Ausdruck true
oder false
ergeben kann; Es gibt keine Garantien. Die beiden Zeichenfolgenliterale "a"
können den gleichen Speicher belegen oder sie können an zwei verschiedenen Speicherorten vorhanden sein.
Ich denke, dass die nächste Sprache in der C++ - Standard ist: "Ob alle Zeichenfolgenliterale unterschiedlich sind (dh in nonoverlapping Objekte gespeichert sind) ist die Implementierung definiert" (C++ 11 §2.14.5/12). Es gibt keine weiteren Anforderungen oder Einschränkungen, daher bleibt das Ergebnis unbestimmt.
"a" != "b"
Dieser Ausdruck muss false
ergeben, weil es keine Möglichkeit gibt, dass diese beiden Stringliterale die gleiche Stelle im Speicher belegen kann: "a"[0] != "b"[0]
.
Wenn Sie String-Literale auf diese Weise vergleichen, vergleichen Sie die Zeiger tatsächlich mit den Anfangselementen in den Arrays.
Weil wir Zeiger, die relationalen Vergleiche zu vergleichen (<
, >
, <=
und >=
) sind noch problematischer als die Gleichheitsvergleiche (==
und !=
), da nur eine begrenzte Menge von Zeigern Vergleichen mit dem relationalen durchgeführt werden kann Vergleiche. Zwei Zeiger können nur dann verglichen werden, wenn sie beide Zeiger in dasselbe Array oder Zeiger in dasselbe Objekt sind.
Wenn die beiden "a"
Stringliterale die gleiche Stelle im Speicher einnehmen, dann würde "a" < "a"
sein gut definiert und false
ergeben würde, weil beiden Zeiger auf das Anfangselement Punkt ('a'
) desselben Arrays.
Wenn jedoch die beiden "a"
Stringliterale verschiedene Stellen im Speicher belegen, ist das Ergebnis "a" < "a"
undefiniert, weil die beiden Zeiger Punkt in völlig unabhängige Objekte verglichen werden.
Da "a"
und "b"
niemals die gleiche Position im Speicher belegen können, hat "a" < "b"
immer undefiniertes Verhalten. Das gleiche gilt für die anderen relationalen Vergleichsoperatoren.
Wenn Sie aus irgendeinem Grund zwei String-Literale relational vergleichen möchten und gut definierte Ergebnisse haben, können Sie den std::less
Comparer verwenden, der eine strikt-schwache Reihenfolge über alle Zeiger bietet. Es gibt auch std::greater
, std::greater_equal
und Vergleiche.Angesichts der Tatsache, dass String-Literale mit den gleichen Inhalten nicht gleichwertig sind, weiß ich nicht, warum man das jemals tun möchte, aber Sie können.
Warum sollten Sie das tun? Für ein garantiert falsch, versuchen Sie 'assert (!" Nachricht geht hier ");' – chris
@chris: Neugier für eins. Auch für eine enum-ähnliche Klassenimplementierungsidee. –
mögliches Duplikat von [Ausgabedifferenz in gcc und turbo C] (http://stackoverflow.com/questions/3289354/output-difference-in-gcc-and-turbo-c) – kennytm