Zum Spaß hatte ich ein std::list
von const char*
, wobei jedes Element auf eine Null-terminierte Textzeichenfolge zeigt und ein std::list::sort()
darauf lief. Wie es passiert, sortierte es (kein Wortspiel beabsichtigt) die Zeichenfolgen nicht. Wenn man bedenkt, dass es an Zeigern arbeitete, macht das Sinn.
Gemäß der Dokumentation von std::list::sort()
verwendet (standardmäßig) operator <
zwischen den zu vergleichenden Elementen.
Nachdem ich die Liste für einen Moment vergessen habe, lautet meine eigentliche Frage: Wie arbeiten diese (& gt ;, & lt ;, & gt; =, & lt; =) Operatoren an Zeigern in C ++ und C? Vergleichen sie einfach die tatsächlichen Speicheradressen?
%Vor% z.B. auf einem 32-Bit-Little-Endian-System, p1
& gt; p2
weil 0xDAB0BC47
& gt; 0xBABEC475
?
Testing scheint dies zu bestätigen, aber ich dachte mir, es wäre gut, StackOverflow für zukünftige Referenz zu verwenden. C und C ++ machen beide einige komische Dinge zu Zeigern, also weißt du nie wirklich ...
In C ++ können Sie keine Zeiger mit den relationalen Operatoren vergleichen. Sie können nur zwei Zeiger vergleichen, die auf Elemente im selben Array verweisen, oder zwei Zeiger, die auf Elemente desselben Objekts zeigen. (Sie können natürlich auch einen Zeiger mit sich selbst vergleichen.)
Sie können jedoch std::less
und die anderen relationalen Vergleichsfunktionsobjekte verwenden, um zwei beliebige Zeiger zu vergleichen. Die Ergebnisse sind implementierungsdefiniert, aber es ist garantiert, dass es eine Gesamtordnung gibt.
Wenn Sie einen flachen Adressraum haben, ist es wahrscheinlich, dass Zeigervergleiche nur Adressen vergleichen, als wären sie ganze Zahlen.
(Ich glaube, die Regeln sind in C die gleichen, ohne die Vergleichsfunktionsobjekte, aber jemand muss das bestätigen; ich bin bei C nicht annähernd so vertraut wie bei C ++.)
Dies ist nur eine Ergänzung.
In C ++ 20.3.3 / 8:
Für Vorlagen größer, weniger, größer gleich und weniger gleich Spezialisierungen für jeden Zeigertyp ergibt eine totale Ordnung, auch wenn die integrierte Operatoren & lt ;, & gt ;, & lt; =, & gt; = do nicht.
In C 6.5.8 / 5:
Wenn zwei Zeiger auf Objekt oder unvollständige Typen zeigen beide auf die das gleiche Objekt, oder beide zeigen eine Vergangenheit das letzte Element des gleichen Arrays Objekt, vergleichen sie gleich. Wenn die Objekte, auf die gezeigt wird, sind Mitglieder der dasselbe Aggregatobjekt, Zeiger auf Strukturmitglieder, die später deklariert werden vergleiche größer als Zeiger auf Mitglieder, die früher in der Struktur und Zeiger auf Array Elemente mit größeren tiefgestellten Werten vergleiche größer als Zeiger auf Elemente des gleichen Arrays mit niedrigeren tiefgestellte Werte. Alle Hinweise zu Mitglieder des gleichen Union-Objekts vergleiche gleich. Wenn der Ausdruck P zeigt auf ein Element eines Arrays Objekt und der Ausdruck Q zeigt auf das letzte Element des gleichen Arrays Objekt, der Zeiger Ausdruck Q + 1 vergleicht größer als P. In allen anderen Fälle, das Verhalten ist nicht definiert .
Also, ich denke, das Vergleichen von char const*
, das zu zwei verschiedenen '\ 0'-terminierten Strings gehört, wie in der Frage, ist ein undefiniertes Verhalten (in C).
Tags und Links c c++ comparison pointers operators