Wert eines chars



  • Hey, ich noch einmal! 🙂

    Ich frage mich ja schon, was genau gemacht wird, wenn man so etwas wie

    int main()
    {
    std::string wort1, wort2;
    std::cin >> wort1;
    std::cin >> wort2;

    if(wort1 > wort2)
    irgendwas;

    return 0;
    }

    Wie will der Compiler wissen, dass das wort1 jetzt einen größeren Wert hat als wort2?
    Denn strings bestehen ja nur aus chars, welche ja allesamt genau 1Byte groß sind.
    Ja gut, A hat den Ascii-Wert 65, B = 66, usw.
    Aber wenn man die Ascii-Werte nur zusammenaddieren würde, wäre einem ja nicht geholfen, weil dann ja bspw. A+D = B+C wäre.
    Also wie ermittelt der Compiler den expliziten eines jeden chars (und daraus gesehen eines Wortes)?

    Danke schon mal für die Antworten! 🙂

    Ach ja:

    #include <iostream>

    int main()
    {
    std::cout << "Frohes neues Jahr!" << std::endl;

    return 0;
    

    }



  • Man kann in C++ Operatoren überladen, z.B. den < Operator, und dann kann man in der Implementierung etwas machen, was für die jeweilige Klasse sinnvoll ist.

    std::string macht einen lexikographischen Vergleich.



  • @JTR666 warum sollten hier ASCII Werte addiert werden? Wie kommt man auf so eine Idee?



  • @Mechanics Und wie sieht dann die Funktion dafür aus?
    Oder ist in string eine ganzes Wörterbuch implementiert?



  • @manni66 sagte in Wert eines chars:

    @JTR666 warum sollten hier ASCII Werte addiert werden? Wie kommt man auf so eine Idee?

    Die Quersumme ist jetzt an sich nicht total verrückt. Zumindest nicht verrückter, als zu sagen: "Blauwal ist größer als Ahorn".
    Für jemanden der neu in der Programmierwelt ist sind beide Varianten nicht unbedingt logisch.



  • @JTR666 sagte in Wert eines chars:

    @Mechanics Und wie sieht dann die Funktion dafür aus?
    Oder ist in string eine ganzes Wörterbuch implementiert?

    Solche Fragen lassen sich ganz einfach auf https://en.cppreference.com nachschauen:

    • Suche nach std::string (rechts oben)
    • Runter scrollen bis operator>
    • The ordering comparisons are done lexicographically -- the comparison is performed by a function equivalent to std::lexicographical_compare or std::lexicographical_compare_three_way (since C++20)

    Wie genau std::lexicographical_compare funktioniert steht da auch, solltest du ohne Probleme finden können.



  • @JTR666 Wie findest du Wörter im Lexikon oder Namen im Telefonbuch?
    Die sind ja sortiert. Auch da gibt es Regeln, dass z.B Schmidt vor Schmitt steht.

    Da ist die Position der Buchstaben im Alphabet entscheidend.

    Es werden also die Zeichen an derselben Position in den Wörtern verglichen. Beim ersten Unterschied ist schon klar, welche Reihenfolge die Wörter haben.



  • @It0101 sagte in Wert eines chars:

    @manni66 sagte in Wert eines chars:

    @JTR666 warum sollten hier ASCII Werte addiert werden? Wie kommt man auf so eine Idee?

    Die Quersumme ist jetzt an sich nicht total verrückt. Zumindest nicht verrückter, als zu sagen: "Blauwal ist größer als Ahorn".
    Für jemanden der neu in der Programmierwelt ist sind beide Varianten nicht unbedingt logisch.

    Ernsthaft? Die naheligende Lösung, die jeder erwartet (und bei C-Strings auf die Schnauze fällt), verwirft man und denkt sich eine aus Absurdistan aus? Bevor man anfängt "querzudenken" sollte man lernen, geradeaus zu denken. Das gilt nicht nur für Veganköche,



  • @JTR666 Das hat C Newbie zwar schon beantwortet, aber es lohnt sich vielleicht tatsächlich drüber nachzudenken, wie du auf so etwas kommst. Vielleicht denkst du einfach noch zu kompliziert oder nicht geradlinig genug.
    Warum sollte man ein Wörterbuch brauchen? Was macht ein Wörterbuch? Nach welchen Kriterien hat man das Wörterbuch aufgebaut, und was sollte dem string da an Informationen fehlen?

    @It0101 Ich glaub, das Wort "größer" mag hier etwas verwirrend sein. Die Vergleichsoperatoren geben eine Sortierreihenfolge vor. Und beim Sortieren von Wörtern leuchtet die alphabetische bzw. lexikographische Sortierung doch viel eher ein, als eine Quersumme.
    Wenn man "größer" sagt, ist vielleicht nicht sofort einleuchtend, was größer in dem Zusammenhang bedeutet. Aber im Grunde ist es mühselig, drüber nachzudenken. Damit beschäftigt man sich ein Mal, und dann weiß man das, und das ist dann auch logisch.



  • @manni66 sagte in Wert eines chars:

    @It0101 sagte in Wert eines chars:

    Die Quersumme ist jetzt an sich nicht total verrückt.

    Ernsthaft? Die naheligende Lösung, die jeder erwartet (und bei C-Strings auf die Schnauze fällt), verwirft man und denkt sich eine aus Absurdistan aus? Bevor man anfängt "querzudenken" sollte man lernen, geradeaus zu denken. Das gilt nicht nur für Veganköche,

    Du hast mit deiner Art zu antworten leider oft die Tendenz, den Fragesteller lediglich mit der Nase darauf zu stossen, was für ein Idiot er ist und es damit bewenden zu lassen (möglicherweise unbeabsichtigt, aber so kommt das für mich rüber).

    Auch wenn du damit meistens recht hast und es immer wieder unbelehrbare Fragesteller gibt, bei denen sowas angebracht ist, halte ich das didaktisch für wenig hilfreich. So eine konfrontative Art ruft psychologisch wahrscheinlich erst einmal Widerstand hervor und senkt die Bereitschaft, sich selbst zu erarbeiten, warum etwas eine schlechte Idee ist. Leute mit weniger gefestigtem Sebstbewusstsein könnten sich sogar irgendwann gar nicht mehr trauen, eigene Ideen zu entwickeln, wenn sie öfter allzu schroff öffentlich zurechtgewiesen werden.

    Ja, die Quersumme kein "geradliniger" Ansatz wie die lexikografische Ordnung, wie man sie in Wörter- oder Telefonbüchern findet (falls man sowas heutzutage noch kennt 😉 ). Allerdings ist die Ordnung auch keine intrinsische und eindeutige Eigenschaft einer Menge. Man kann sehr wohl verschiedene Ordnungsrelationen definieren, die im jeweiligen Kontext mal mehr und mal weniger Sinn machen.

    Die Quersumme hat hier allerdings ein grundlegendes Problem, durch dass sie als Kandidat direkt ausscheidet: Sie ist keine Ordnung im mathematischen Sinn, da sie die Antisymmetrie-Eigenschaft xyyxx=yx \leq y \land y \leq x \Rightarrow x = y verletzt. abc und cba, oder wie im Beispiel von @JTR666 ad und bc hätten die selbe Quersumme (linke Seite der Antisymmetrie-Implikation erfüllt), wären aber dennoch nicht die selben Elemente (Gleichheit nicht erfüllt). Verscheidene Elemente mit gleicher Quersumme lassen sich nicht in eine eindeutige Reihenfolge bringen, dadurch ist der Ansatz unbrauchbar um Strings zu sortieren.

    Wenn wir schon bei "nicht-geradlinigen" Ansätzen sind: Man könnte die Strings auch als lange Integer in einem 256-adischen Zahlensystem mit den chars als "Ziffern" interpretieren. Das gäbe uns eine eindeutige Ordnung und wäre vielleicht sogar für Computer in einigen Fälle ein wenig simpler zu handhaben, da man bei unterschiedlicher Stringlänge direkt anhand dieser sagen kann, welcher String "kleiner" ist, ohne das gemeinsame Präfix beider Strings durchlaufen zu müssen. Das führt allerdings zu Sortierungen, die für uns Menschen etwas sperrig zu lesen sind: a, b, c, aa, zz, aaa, Aachen. Um den Eintrag "Aachen" zu finden müssen wir bis zum Ende der Liste suchen. Man stelle sich vor ein physisches Wörterbuch wäre so sortiert 😉

    TL;DR: Lexikografische Sortierung macht schon am meisten Sinn.


  • Mod

    @Finnegan sagte in Wert eines chars:

    Die Quersumme hat hier allerdings ein grundlegendes Problem, durch dass sie als Kandidat direkt ausscheidet: Sie ist keine Ordnung im mathematischen Sinn, da sie die Antisymmetrie-Eigenschaft xyyxx=yx \leq y \land y \leq x \Rightarrow x = y verletzt. abc und cba, oder wie im Beispiel von @JTR666 ad und bc hätten die selbe Quersumme (linke Seite der Antisymmetrie-Implikation erfüllt), wären aber dennoch nicht die selben Elemente (Gleichheit nicht erfüllt). Verscheidene Elemente mit gleicher Quersumme lassen sich nicht in eine eindeutige Reihenfolge bringen, dadurch ist der Ansatz unbrauchbar um Strings zu sortieren.

    Gewisse Klugscheißer würden in dem Fall sagen, dass das kein Widerspruch ist, sondern du stattdessen dadurch definiert hast, dass 'abc' und 'cba' gleich sind 🙂



  • @SeppJ sagte in Wert eines chars:

    Gewisse Klugscheißer würden in dem Fall sagen, dass das kein Widerspruch ist, sondern du stattdessen dadurch definiert hast, dass 'abc' und 'cba' gleich sind.

    Ja, das kann man so betrachten und es gibt sicher auch eine Kontext, in dem das Sinn macht. Ich meinte aber eine via Quersummen definierte Ordnung über der Menge der Strings und nicht über die Menge der Quersummen - bei letzterer wären natürlich 'abc' und 'cba' Repräsentanten für dasselbe Element. Innerhalb der Strings können wir uns aber sicher darauf einigen, dass es verschiedene Elemente sind (?) 🙂

    Auch schön um die Ecke gedacht, verdirbt einem aber u.a. leider den Spass an schönen Dingen wie std::sort, std::map oder std::binary_search ... einziger Vorteil ist wohl, dass es beim Debuggen nicht langweilig wird, besonders wenn es häufig so aussieht, als würde es funktionieren 😉


  • Mod

    @Finnegan sagte in Wert eines chars:

    Auch schön um die Ecke gedacht, verdirbt einem aber u.a. leider den Spass an schönen Dingen wie std::sort, std::map oder std::binary_search ... einziger Vorteil ist wohl, dass es beim Debuggen nicht langweilig wird, besonders wenn es häufig so aussieht, als würde es funktionieren 😉

    Mit denen würde es ja tatsächlich funktionieren. Das ist es übrigens, was mich überhaupt zu der Bemerkung brachte. Denn sort, map, binary_search & Co. interessiert es nur, dass die Ordnungsfunktion transitiv ist (d.h. a<b und b<c impliziert a<c), was bei der Quersumme gegeben ist. Und bei ihnen gelten dann zwei Elemente a und b als "gleich" (oder vielleicht sollte man lieber "äquivalent" sagen), genau dann wenn !(a < b) && !(b < a).

    PS: Lustig wird's wenn man sort, map, & Co. eine nicht-transitive Ordnungsrelation vorsetzt. Da hat man wirklich Spaß beim Debuggen und glaubt bald an Gremlins 🙂



  • @Finnegan sagte in Wert eines chars:

    Ja, das kann man so betrachten und es gibt sicher auch eine Kontext, in dem das Sinn macht. Ich meinte aber eine via Quersummen definierte Ordnung über der Menge der Strings und nicht über die Menge der Quersummen - bei letzterer wären natürlich 'abc' und 'cba' Repräsentanten für dasselbe Element. Innerhalb der Strings können wir uns aber sicher darauf einigen, dass es verschiedene Elemente sind (?) 🙂

    Die 2||\;||_2 Norm auf den komplexen Zahlen bildet reiϕr e^{i\phi} doch auch auf rr ab, da sind es sogar unendliche viele Zahlen, die auf eine Zahl abgebildet werden. Natürlich ergibt eine Quersumme als Ordnungsrelation kaum einen Sinn, wenn man den normalen täglichen Gebrauch von Worten als Grundlage nimmt.



  • Junge Junge, da hab ich ja mal echt n Thema losgetreten, haha! 😃

    Aber ist echt interessant was man hier so liest! 🙂



  • @SeppJ sagte in Wert eines chars:

    @Finnegan sagte in Wert eines chars:

    Auch schön um die Ecke gedacht, verdirbt einem aber u.a. leider den Spass an schönen Dingen wie std::sort, std::map oder std::binary_search ...

    Mit denen würde es ja tatsächlich funktionieren. Das ist es übrigens, was mich überhaupt zu der Bemerkung brachte. Denn sort, map, binary_search & Co. interessiert es nur, dass die Ordnungsfunktion transitiv ist (d.h. a<b und b<c impliziert a<c), was bei der Quersumme gegeben ist. Und bei ihnen gelten dann zwei Elemente a und b als "gleich" (oder vielleicht sollte man lieber "äquivalent" sagen), genau dann wenn !(a < b) && !(b < a).

    Funktionieren würde es schon für eine Definition von "funktionieren". Ebenso gibt es aber auch eine Definition, für die es eben nicht funktioniert. Oder übersehe ich hier etwas wesentliches? Eine Suche nach "John Jackson" könnte mir z.B. entweder "Jack Johnson" oder <not found> zurückgeben, obwohl sich der gesuchte Wert in der Datenstruktur befindet - oder auch den gesuchten Wert, aber nur wenn ich Glück habe. Das wäre ein Verhalten, dass in meinem Buch mindestens eine Definition von "nicht funktionieren" erfüllt 😉

    Ist es nicht ausschliesslich von der Reihenfolge der Elemente im für eine Definition "korrekt sortierem Array" [cab, abc, bac, acb, bca, cba] abhängig, ob und welches Element eine Binärsuche zutage fördert?

    PS: Lustig wird's wenn man sort, map, & Co. eine nicht-transitive Ordnungsrelation vorsetzt. Da hat man wirklich Spaß beim Debuggen und glaubt bald an Gremlins 🙂

    Ich empfehe dazu auf jeden Fall noch irgendwas mit Threads, um ein wenig Determinismus aus den auftretenden Fehlern herauszunehmen 😉

    @john-0 sagte in Wert eines chars:

    @Finnegan sagte in Wert eines chars:

    Die 2||\;||_2 Norm auf den komplexen Zahlen bildet reiϕr e^{i\phi} doch auch auf rr ab, da sind es sogar unendliche viele Zahlen, die auf eine Zahl abgebildet werden.

    Dennoch sind die Zahlen, die auf diesem Kreis mit Radius rr liegen nicht "gleich". Oder gilt etwa 1=11 = -1? ... abgesehen natürlich von irgendwelchen "Trickbeweisen", bei denen man meist irgendwo durch 00 dividiert, ohne es zu merken ;). Ein std::set.contains(1) würde mich eventuell anlügen (Ja, auch wenn ich vorher noch mit == überprüfe, weil ich nämlich im falschen Unterbaum gelandet bin, wo ich die sehr wohl existierende 1 nicht mehr finde).

    Dein Beispiel bringt mich allerdings auf etwas anderes, wo eine ähnliche Ordnung auf "äquivalenten" Elementen, tatsächlich Sinn machen könnte: Für eine Menge von mathematischen Ausdrücken, bei denen z.B. 1=33=eiπ=ei2π=0.91 = { 3 \over 3 } = -e^{i\pi} = e^{i2\pi} = 0.\overline 9 gilt, auch wenn es sich um verscheidene Ausdrücke handelt.

    Oder vielleicht noch etwas praktischer: Ein UTF-8-Stringvergleich, bei dem z.B.

    a (U+0061 Kleiner lateinischer Buchstabe A) + ̈ (U+0308 Verbindungszeichen Diärese) = ä (U+00E4 Kleiner lateinischer Buchstabe A mit Diärese)

    und eine entsprechende lexikografische Ordnungsrelation gilt.

    @JTR666 sagte in Wert eines chars:

    Junge Junge, da hab ich ja mal echt n Thema losgetreten, haha! 😃

    Das ist der irreversible Schaden, den man nimmt, wenn man so einen Scheiss irgendwann mal studiert hat. Da werden Dinge, die vorher mal simpel waren, auf einmal sehr kompliziert, wenn man anfängt, zuviel darüber nachzudenken. Für die Praxis tuts aber meist erstmal die simple Variante, sonst kommt man nämlich zu nix 😉


  • Mod

    @Finnegan sagte in Wert eines chars:

    @SeppJ sagte in Wert eines chars:

    @Finnegan sagte in Wert eines chars:

    Auch schön um die Ecke gedacht, verdirbt einem aber u.a. leider den Spass an schönen Dingen wie std::sort, std::map oder std::binary_search ...

    Mit denen würde es ja tatsächlich funktionieren. Das ist es übrigens, was mich überhaupt zu der Bemerkung brachte. Denn sort, map, binary_search & Co. interessiert es nur, dass die Ordnungsfunktion transitiv ist (d.h. a<b und b<c impliziert a<c), was bei der Quersumme gegeben ist. Und bei ihnen gelten dann zwei Elemente a und b als "gleich" (oder vielleicht sollte man lieber "äquivalent" sagen), genau dann wenn !(a < b) && !(b < a).

    Funktionieren würde es schon für eine Definition von "funktionieren". Ebenso gibt es aber auch eine Definition, für die es eben nicht funktioniert. Oder übersehe ich hier etwas wesentliches? Eine Suche nach "John Jackson" könnte mir z.B. entweder "Jack Johnson" oder <not found> zurückgeben, obwohl sich der gesuchte Wert in der Datenstruktur befindet - oder auch den gesuchten Wert, aber nur wenn ich Glück habe. Das wäre ein Verhalten, dass in meinem Buch mindestens eine Definition von "nicht funktionieren" erfüllt 😉

    Ich denke eher "übersehen". Da ist gar kein Glück dabei. Die Strukturen funktionieren absolut wohldefiniert, solange die Anforderung an den Vergleichsoperator erfüllt ist. Und sie funktionieren nicht, wenn nicht. Hier ist die Anforderung aber erfüllt. Eine Suche nach "John Jackson" würde dann auch "Jack Johnson" zurück liefern, denn die beiden sind unter dieser Ordnung gleich. Ich erinnere an meine erste Bemerkung:

    @SeppJ sagte in Wert eines chars:

    Gewisse Klugscheißer würden in dem Fall sagen, dass das kein Widerspruch ist, sondern du stattdessen dadurch definiert hast, dass 'abc''Jack Johnson' und 'cba''John Jackson' gleich sind 🙂



  • @Finnegan sagte in Wert eines chars:

    Dennoch sind die Zahlen, die auf diesem Kreis mit Radius rr liegen nicht "gleich". Oder gilt etwa 1=11 = -1?

    Die Strings "abc" und "cba" doch auch nicht! D.h. es gibt sinnvolle Definitionen für Ordnungsrelationen, bei denen mehrere Werte auf einen Wert abgebildet werden.


  • Mod

    @Finnegan sagte in Wert eines chars:

    Das ist der irreversible Schaden, den man nimmt, wenn man so einen Scheiss irgendwann mal studiert hat. Da werden Dinge, die vorher mal simpel waren, auf einmal sehr kompliziert, wenn man anfängt, zuviel darüber nachzudenken. Für die Praxis tuts aber meist erstmal die simple Variante, sonst kommt man nämlich zu nix 😉

    Eigentlich ist alles viel einfacher. Man merkt bloß, dass die einfachen Zusammenhänge, die man aus der Grundschule kennt, auch auf furchtbar komplizierte Dinge anwendbar sind. Die Grundidee hier, dass Dinge genau dann gleich sind, wenn sie weder kleiner noch größer sind, kann jeder begabte Drittklässler nachvollziehen.


Log in to reply