operator precedence beim Einlesen von Arrays



  • Hallo,

    ich bringe mir mit dem Buch "Beginner's C" (Ivor Horten) die Grundlagen von C bei (damit ich demnächst den K&R in Angriff nehmen kann). Ich bin absoluter Neuling in der Programmierung. Ich möchte anhand des angehängten Codes etwas über Operatorpräzedenz lernen:

    //learning about operator precedence by trying to read-in strings
    
    void main()
    {
        char firstArray[200], dummy[200], secondArray[200];
        char *pBufferOne = firstArray;
        char *pBufferTwo = secondArray;
    
        printf("Enter something:\n");
        while( ( *(pBufferOne++) = getchar() )!= '\n');
        printf(" %c %c %c \n", firstArray[0], firstArray[1], firstArray[2]);
    
        printf("Enter the same thing again: \n");
        while( ( *(++pBufferTwo) = getchar() )!= '\n');
        printf(" %c %c %c", secondArray[0], secondArray[1], secondArray[2]);
    
    }
    

    Im Code soll mit einem Pointer in einer While Schleife ein String eingelesen werden. Das geschieht zweimal (der Benutzer soll beide male das gleiche eingeben). Der einzige Unterschied ist die Position des "++" in den beiden While Schleifen.

    Der Knackpunkt ist für mich dieses Stückchen Code:

    *(pBufferOne++) = getchar()
    

    Ich verstehe das so:

    1. Schritt: in die "()" von pBufferOne++ gehen
    2. Schritt: "++" anwenden (also Adresse erhöhen)
    3. Schritt: mit "*" dereferenzieren, also auf den Wert des Pointers verweisen
    4. Schritt: mit "=" von getchar() den Input in soeben angewiesene Adresse schreiben

    Beim Ausführen des Codes, allerdings Schritt 4 vor Schritt 2 ausgeführt. Anders kann ich mir jedenfalls den Output nicht erklären. Ich verstehe nicht, warum in der zweiten While Schleife der Array um eins versetzt aufgefüllt wird (im Vergleich zu ersten Schleife), da ich ja eine Klammer gesetzt habe.

    Deshalb die Frage: wo liegt der Fehler in meinem Denkansatz?



  • Das hat nichts mit operator precedence zu tun. Der Ausdruck "x++" hat den Wert von x bevor es erhöht wurde, der Ausdruck "++x" dagegen hat den Wert von x nachdem es erhöht wurde. Deswegen schreibt man (ich ;)) auch ++x, wo beides geht.



  • Danke für die schnelle Antwort! Ich kann deine Argumentation sehr gut nachvollziehen.

    Meine Verwirrung enstammt dem Umstand, dass in dem Buch (I. Horton) "++" und "--" als selbständige Operatoren mit entsprechendem Prezedenzlevel angegeben sind (auf einer Stufe mit "!", "unary+", "unary-". Ich finde das etwas verwirrend, aber vielleicht wird es mir später noch klarer, worauf der Author damit hinauswill.



  • ++ und -- sind auch eigenständige operatoren, und darüber hinaus sind pre-++ bzw post-++ (bzw --) auch unterschiedliche operatoren die verscheidene precedence level haben. siehe hier: http://en.cppreference.com/w/cpp/language/operator_precedence
    du solltest dir zunächst mal klar machen, was der unterschied zwischen pre und post-in(de)crement ist.



  • danke für die Hilfe und den Link! sehr aufschlussreich.


Anmelden zum Antworten