String To Long



  • Hallo,
    ich verstehe diese Auskommentierung immer noch nicht. Auch wenn ich Leerzeichen der Zahl voranstelle, wird das Programm korrekt ausgeführt.
    Man kann ja sehen, dass die Schleife keine Anweisung besitzt, keine Variablen ändert und daher nur eine Verzögerung des Programms
    darstellt.

    Ich meinte eigentlich, dass hier ja nur von der impliziten Typumwandlung Gebrauch gemacht wird. Diese Methode wandelt den Typ also nur um, weil
    sie sich auf die automatische Umwandlung stützt.

    Vielen Dank
    lg, freakC++



  • freakC++ schrieb:

    Man kann ja sehen, dass die Schleife keine Anweisung besitzt, keine Variablen ändert und daher nur eine Verzögerung des Programms darstellt.

    Die Schleife ändert sehr wohl eine Variable nämlich i :

    register int i = 0;
    /* ... */
    for(i=0;i<str.size() && isspace(str[i]); ++i)
        ;
    /* ... */
    


  • freakC++ schrieb:

    Ich meinte eigentlich, dass hier ja nur von der impliziten Typumwandlung Gebrauch gemacht wird. Diese Methode wandelt den Typ also nur um, weil sie sich auf die automatische Umwandlung stützt.

    In der zweiten for-Schleife wird gerechnet, da kannst du doch nicht von impliziter Typumwandung sprechen. Wo wäre denn deiner Meinung nach eine implizite Umwandlung, auf die sich dieser Algorithmus stützt?

    Stefan.



  • teste mal _-666 ( wobei _ Leerzeichen entspricht )



  • Wenn ich -666 inklusive Leerzeichen eingebe und beide Versionen damit teste (also einmal mit Kommentar und einam l nicht), dann kommt bei beiden das gleiche Ergebnis.

    Wenn ich str[i] einem long Wert zuweise, dann muss doch eine Typumwandlung erfolgen, denn str ist doch ein String. Was verstehe ich da falsch?

    Vielen Dank
    lg, freakC++


  • Mod

    freakC++ schrieb:

    Wenn ich str[i] einem long Wert zuweise, dann muss doch eine Typumwandlung erfolgen, denn str ist doch ein String. Was verstehe ich da falsch?

    str ist zwar ein string, str[i] aber nicht - das ist ein char. Und somit wären wir wieder bei dem Thema, dass man solche Sachen in wenigen Sekunden in einer Referenz nachschlagen kann.



  • freakC++ schrieb:

    Wenn ich -666 inklusive Leerzeichen eingebe und beide Versionen damit teste (also einmal mit Kommentar und einam l nicht), dann kommt bei beiden das gleiche Ergebnis.

    Dann sind die Leerzeichen bereits vorher aus dem String entfernt worden.

    Wenn ich str[i] einem long Wert zuweise, dann muss doch eine Typumwandlung erfolgen, denn str ist doch ein String. Was verstehe ich da falsch?

    Der string::operator[] liefert ein char, was bei einer Zuweisung auf eine Variable vom Typ long automatisch konvertiert wird.


  • Mod

    Und da ich schon ahne, was die nächste Frage sein wird: char ist ein integraler Datentyp (das heißt, verhält sich wie eine Ganzzahl). Man kann damit genauso rechnen wie mit int. Und genau das ist es, was bei dem Algorithmus passiert.

    zahl * 10 + (str[i] - '0');
    

    Zuerst wird von dem Wert von str[i] der Wert des chars '0' abgezogen. Die Idee dahinter ist, dass in der Zeichentabelle die Ziffern als 0123456789 angeordnet sind. Daher hat das Ergebnis der Subtraktion hinterher Werte zwischen 0 und 9. Danach wird das Ergebnis dann einem Stellenwertsystem entsprechend der Variablen zahl hinzugefügt.

    Wie aber schon angemerkt wurde, muss man sich dazu auf eben genau diese Eigenschaft der Zeichentabelle verlassen können. Wenn man wirklich portabel programmieren möchte, sollte man daher die fertigen Funktionen zur Umwandlung benutzen oder etwas programmieren, dass diese Annahme nicht zwangsläufig macht.

    Trotzdem ist die Funktion sehr gut als Anschauungsmaterial geeignet.



  • Hallo,
    achso...jetzt verstehe ich! Tja, SeppJ...du scheinst hellseherische Kräfte zu besitzen. Danke für die Antwort im Voraus!
    Erst die Antwort dann die Frage...interessante Reihenfolge!

    [edit] Das hätte aber sogar ich gewusst 😃

    Vielen Dank --> ihr seit toll
    lg, freakC++



  • SeppJ schrieb:

    Wie aber schon angemerkt wurde, muss man sich dazu auf eben genau diese Eigenschaft der Zeichentabelle verlassen können. Wenn man wirklich portabel programmieren möchte, sollte man daher die fertigen Funktionen zur Umwandlung benutzen oder etwas programmieren, dass diese Annahme nicht zwangsläufig macht.

    Man kann sich drauf verlassen.


Anmelden zum Antworten