Strings | Mathematischer Aspekt.



  • Hey,
    ich lerne derzeitig das "string vergleichen". In meinem Buch wurde beschrieben welche Vergleichsoperatoren es für die Strings gibt wie ich die Strings in Schleifen setze etc.. Das eigentliche Problem ist nicht das Vergleichen von Strings sondern der Mathematische Aspekt an dieser Geschichte. Ich führte ein Experiment durch indem ich sagte das "Haus" den gleichen Wert wie "sauH" hat ich ging davon aus, dass die ASCII-Codes miteinander addiert werden, sprich H = 1, a = 2, u = 3 und s = 4. Es sind nicht die richtigen ASCII-Codes sie dienen nur zur Vorstellung. "Haus" = "H" + "a" + "u" + "s" äquivalent zu "Haus" = 1 + 2 + 3 + 4 = 10. Nach dieser Logik würde "sauH" = 4 + 3 + 2 + 1 = 10. So lief es nicht. Also habe ich mir eine andere Theorie überlegt. Ich nahm an, dass sich die ASCCI-Codes einfach nach einander aufschreiben. Als würde man Strings addieren, sprich

    string a = "Hallo ";
    cout << a + "Hans" << endl;

    Das funktionierte auch nicht also nahm ich mein Experiment auseinander und raus gekommen ist das.

    Mein Experiment:

    int a = 'H', b = 'a', c = 'u', d = 'a';
    int e = 's', f = 'a', g = 'u', h = 'H';
    int Haus = 'Haus';
    int sauH = 'sauH';
    cout << a << "\n" << b << "\n" << c << "\n" << d << endl;
    cout << e << "\n" << f << "\n" << g << "\n" << h << endl;
    cout << Haus << endl;
    cout << sauH << endl;

    Ausgabe:
    72
    97
    117
    97
    115
    97
    117
    71
    1214346611
    1935766856

    Und nun benötige ich eure Hilfe. Wie sind die letzten beiden Werte zu verstehen?



  • Multibyte Character



  • 1.) Dein Problem ist unklar.
    2.) Das ist Quatsch:

    int Haus = 'Haus'; 
    int sauH = 'sauH';
    

    Mathematische Aspekt an dieser Geschichte

    Haeh? Warum sollten Strings gleich sein, wenn die Summe ihrer "Zeichen" gleich sind?

    So lief es nicht. Also habe ich mir eine andere Theorie überlegt.

    Vielleicht solltest du dir keine wilden Theorien ueberlegen und an geeigneter Stelle nachlesen.



  • knivil schrieb:

    2.) Das ist Quatsch:

    int Haus = 'Haus'; 
    int sauH = 'sauH';
    

    Es gibt durchaus Fälle, wo das so gewollt steht.



  • Anfänger53 schrieb:

    Also habe ich mir eine andere Theorie überlegt.

    Man lernt keine Programmiersprache, indem man sich Theorien überlegt. Du bist auf dem total falschen Dampfer. Damit meine ich, dass es überhaupt keinen Sinn in Standard-C++ ergibt, sich zu fragen, was 'Haus' oder 'hauS' bedeutet. Mit ' umschließt du einzelne Zeichen und mit " umschließt du Zeichenketten. Fertig aus.



  • Es gibt durchaus Fälle, wo das so gewollt steht.

    Bullshit.



  • knivil schrieb:

    Es gibt durchaus Fälle, wo das so gewollt steht.

    Bullshit.

    www.boost.org/libs/mpl/doc/refmanual/string.html



  • Anfänger53 schrieb:

    Mein Experiment:
    
    	int a = 'H', b = 'a', c = 'u', d = 'a';
    	int e = 's', f = 'a', g = 'u', h = 'H';
    

    "Haua" und "sauH"?!
    War nicht "Haus" Ausgangspunkt für Dein "Experiment"?

    Übrigens ist Deine erste Annahme richtig (Kommutativgesetz):

    'H' + 'a' + 'u' + 's'
    == 's' + 'u' + 'a' + 'H'
    


  • Ach übrigens, Strings werden Zeichen für Zeichen nach dem ASCII Code verglichen (standardmäßig)...



  • mitsosse schrieb:

    www.boost.org/libs/mpl/doc/refmanual/string.html

    Ach du meinst, das mit Praeprozessordirektiven vollgestopfte boost::ding kann mit der einfachen Zeile in Verbindung gebracht werden? 🙄 Hast du mpl::string<'hell','o wo','rld'> mal hinterfragt? Wie sieht das Konstrukt aus, nachdem der Praeprozessor damit fertig ist.



  • Nathan schrieb:

    Ach übrigens, Strings werden Zeichen für Zeichen nach dem ASCII Code verglichen (standardmäßig)...

    Danke, dass veranlasst mich weiter zu machen.

    Zu den anderen Antworten ich habe damit gemeint, das sich hinter jedem Buchstaben ein ASCII-Code verbirgt und ich die ASCII-Codes als Zahlen gesehen habe. Mir kam es nur auf den Zahlen Wert hinter dem String an. Ich wollte Wissen wie die letzten 2 Zahlen entstanden sind. Wie das System auf so etwas kommt. Es tut mir leid, wenn ich mich falsch ausgedrückt habe.



  • knivil schrieb:

    mitsosse schrieb:

    www.boost.org/libs/mpl/doc/refmanual/string.html

    Ach du meinst, das mit Praeprozessordirektiven vollgestopfte boost::ding kann mit der einfachen Zeile in Verbindung gebracht werden? 🙄 Hast du mpl::string<'hell','o wo','rld'> mal hinterfragt? Wie sieht das Konstrukt aus, nachdem der Praeprozessor damit fertig ist.

    Naja, genau gleich wie vorher. Der Präprozessor ist nur dazu da, variadische Templates zu simulieren.



  • Anfänger53 schrieb:

    Nathan schrieb:

    Ach übrigens, Strings werden Zeichen für Zeichen nach dem ASCII Code verglichen (standardmäßig)...

    Danke, dass veranlasst mich weiter zu machen.

    Zu den anderen Antworten ich habe damit gemeint, das sich hinter jedem Buchstaben ein ASCII-Code verbirgt und ich die ASCII-Codes als Zahlen gesehen habe. Mir kam es nur auf den Zahlen Wert hinter dem String an. Ich wollte Wissen wie die letzten 2 Zahlen entstanden sind. Wie das System auf so etwas kommt. Es tut mir leid, wenn ich mich falsch ausgedrückt habe.

    Ein string ist ein array von chars, und ein char ist nur eine auf eine spezielle Art interpretierte Ganzzahl mit 1 byte Länge.

    Wenn du zwei strings vergleichst, dann wird das einfach elementweise gemacht.

    Die beiden Zahlen die du für 'Haus' und 'suaH' bekommen hast ist aber irgendwas Seltsames, dass erstens mit irgendwelchen Vergleichen nicht viel zu tun hat und mir, zweitens, auch nichts sagt. Wie etwas weiter oben jemand erwähnt hat, erstellt man zwischen den einzelnen Apostrophen (') einzelne chars und nicht strings (viele einzelne chars in einem array zusammengefasst).

    Man müsste erstmal rausfinden, was ein so multibyte-char sein soll und wie seine integer-Repräsentation aussieht.



  • Anfänger53 schrieb:

    Zu den anderen Antworten ich habe damit gemeint, das sich hinter jedem Buchstaben ein ASCII-Code verbirgt und ich die ASCII-Codes als Zahlen gesehen habe. Mir kam es nur auf den Zahlen Wert hinter dem String an.

    Das ist für die meisten Plattformen ja auch richtig. Dafür braucht es aber keine Experimente sondern Quellen - Dein Buch z.B.

    Anfänger53 schrieb:

    Ich wollte Wissen wie die letzten 2 Zahlen entstanden sind. Wie das System auf so etwas kommt. Es tut mir leid, wenn ich mich falsch ausgedrückt habe.

    Ob die Werte Sinn ergeben oder nicht ist vom Hersteller Deines Compilers abhängig (implementation-defined) Im Standard:

    2.14.3/1
    A character literal is one or more characters enclosed in single quotes, as in ’x’, optionally preceded by
    one of the letters u, U, or L, as in u’y’, U’z’, or L’x’, respectively. A character literal that does not begin
    with u, U, or L is an ordinary character literal, also referred to as a narrow-character literal. An ordinary
    character literal that contains a single c-char has type char, with value equal to the numerical value of the
    encoding of the c-char in the execution character set. An ordinary character literal that contains more than
    one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined
    value.

    gcc interpretiert es wie folgt:

    #include <iostream>
    
    int main(){
        const int Haus = static_cast<int>(
              (unsigned char)'H' * 256 * 256 * 256
            + (unsigned char)'a' * 256 * 256
            + (unsigned char)'u' * 256
            + (unsigned char)'s');
        std::cout << "'Haus': " << 'Haus' << " == " << Haus << '\n';
    }
    


  • Ein string ist ein array von chars, und ein char ist nur eine auf eine spezielle Art interpretierte Ganzzahl mit 1 byte Länge.

    Wenn du zwei strings vergleichst, dann wird das einfach elementweise gemacht.

    Die beiden Zahlen die du für 'Haus' und 'suaH' bekommen hast ist aber irgendwas Seltsames, dass erstens mit irgendwelchen Vergleichen nicht viel zu tun hat und mir, zweitens, auch nichts sagt. Wie etwas weiter oben jemand erwähnt hat, erstellt man zwischen den einzelnen Apostrophen (') einzelne chars und nicht strings (viele einzelne chars in einem array zusammengefasst).

    Man müsste erstmal rausfinden, was ein so multibyte-char sein soll und wie seine integer-Repräsentation aussieht.

    'H' Array 0
    'a' Array 1
    'u' Array 2
    's' Array 3

    Das ist mir bewusst, aber ich habe mir gedachte, dass das System die einzelnen Buchstaben in die ACCI-Codes konvertiert, sodass

    ASCII-Code von H Array 0
    ASCII-Code von a Array 1
    ASCII-Code von u Array 2
    ASCII-Code von s Array 3

    Ich wollte es Mathematisch darstellen, aber ist mir anscheint nicht gelungen.
    Da ich jetzt weiß, dass bei einem Vergleich die Arrays miteinander verglichen werden ist es ok. Leider gibt es ASCII-Code Vergleiche, wenn ich sage 'a' < 'b' werden die ASCCI-Codes verglichen. Ich muss mehr lernen um später noch einmal zu schauen. Alles eine Frage der Zeit 🙂 .



  • 'Haus' ist kein Array! Es ist ein multi-char Literal. Der Typ dieses Ausdrucks int. Der Wert davon ist "implementation-defined". Das ist ein wichtiges Wort aus dem C++ ISO Standard. Es sagt, dass diejenigen, die einen C++-Compiler bauen, sich selbst überlegen können, was dabei rauskommen soll und dies auch dokumentieren müssen. Beim GCC z.B. findet man das hier. Bei anderen Compilern kann das völlig anders aussehen. Ob der Wert von 'A' wirklich 65 ist (wie man das bei ASCII erwarten würde) oder nicht, ist auch "implementation-defined".

    Hausaufgaben für Dich:
    - gescheites C++ Buch besorgen
    - nachgucken, was "implementation-defined", "undefined behaviour" und "unspecified behaviour" im Kontext von C und C++ genau bedeuten.
    - Suche für jeden dieser Begriffe noch jeweils einen Aspekt der Sprache C++, auf den der Begriff passt.


Log in to reply