Post- und Prefix Notation?



  • Hi!

    Ich hab folgendes kleines Programm:

    int i=1, k=0;
    k = i++;

    da wird nun k=1 und i=2.

    Bei

    k = ++i;

    wird k=2 und i=2.

    Wie geht das dann hier?

    #include<stdio.h>
    
    int main()
    {
    	int y = 20, w = 3;
    
    	y = w-- * 10;
    
    return 0;
    }
    

    Laut oben müsste doch hier auch erst der bestehende Wert dem w=3 dem y zugewiesen werden. Aber was macht dann das *10?

    Laut meinem Compiler wird hier aber erst mal 10 gerechnet und dann w dekrementiert. Das verstehe ich nicht...

    Das heißt wenn ich mal das w-- weglasse, dann würde es dem code entsprchen:

    y = w * 10;
    w = w - 1;
    


  • Bei Prefix wird die Variable sofort verändert und dann damit gerechnet. Bei Postfix aber wird der alte Wert zurückgegeben (womit du dann rechnest) und dann der Originalwert verringert.

    int a = 1, b = 2, c; 
    c = a * b; //c=2
    c = a++ * b //c=2 a ist nun 2!
    c = ++a * b //c=4 a ist nun 2!
    

    Einfach geschrieben der Unterschied zwischen Post und Prefix.

    int Postfix(int *a) // a++
    {
       int b = *a;
       *a = *a + 1;
       return b;
    }
    
    int Prefix(int a) // ++a
    {
       a = a + 1;
       return a;
    }
    

    Edit: Vielleicht noch ergänzend ist dies nun gleichbedeutend wie oben.

    int a = 1, b = 2, c; 
    c = a * b; //c=2
    c = Postfix(&a) * b //c=2 a ist nun 2!
    c = Prefix(a) * b //c=4 a ist nun 2!
    

    Ich hoffe das hilft dir, wenn nicht frag ruhig nochmal!



  • Danke Danke!

    Ich glaub ich hab das jetzt mal so halbwegs verstanden. Ich hab jetzt noch eine Frage:

    char zk[2][6] = {"asdfg", "qwer"};
    char *p, *q;
    p = &zk[0][0];
    q = p + 6;

    Wenn ich das oben gezeigt nun durchführe, dann schreib ich mir ja die Adresse des Elements an der Stelle 0,0 vom Array in den pointer p.

    Das sieht doch dann jetzt so aus:

    | <- *p
    -------------------------
    | a | s | d | f | g | 0 |
    -------------------------
      0   1   2   3   4   5
    
    -------------------------
    | q | w | e | r | 0 |   |
    -------------------------
      6   7   8   9   10  11
    

    Nun soll ich die Adresse vom pointer q berechnen in dem ich pointer p + 6 rechne. Muss ich da jetzt 0,1,2,3,4,5,6 zählen?



  • Warum probierst du es nicht selbst? Das Ergebnis und die Komplexität wird dich schockieren!

    printf("%c %c", *p, *q);
    


  • Du musst sechs Felder weiter gehen, das ist es egal ob du bei 0, 1 oder 1001 zu zählen beginnst.

    Was ist p+0 ? Was ist dann p+6 ?



  • für p gibt er mir nun ein 'a' aus und für q ein ' q'.

    Warum mich das jetzt allerdings schockieren soll, weiß ich nicht 😞



  • bandchef schrieb:

    für p gibt er mir nun ein 'a' aus und für q ein ' q'.

    Warum mich das jetzt allerdings schockieren soll, weiß ich nicht 😞

    Das du mit deiner Code schon richtig liegst. Nun musst du nur anstelle der Variable die Adresse ausgeben 😉

    printf("%p %p", p, q);
    


  • Wo hast du die Aufgabe überhaupt her?

    Entweder bist du schizophren oder nicht alleine (aber das bist du im ersten Fall ja auch nicht 😃 ) denn ich hatte gerade ein Déjà-vu von http://www.mikrocontroller.net/topic/205788



  • Der scheint wohl ein Kommilitone zu sein ^^



  • Was ist denn nun mit der Aufgabe?

    Das in diesem Fall ein a und ein q rauskommen weiß ich ja mittlerweile weil ich von 0 aus 6 stellen weiter gehen muss, also quasi von 0 - 6.



  • Du hast doch die Aufgabe schon längst richtig gelöst... oO!?



  • | <- *p
    -------------------------
    | a | s | d | f | g | 0 |
    -------------------------
      0   1   2   3   4   5
    
    -------------------------
    | q | w | e | r | 0 |   |
    -------------------------
      6   7   8   9   10  11
    

    Sorry, aber ich verstehe halt bloß nicht, warum ich von 0 an zu zählen anfangen soll... Wenn ich doch nur 6 stellen weiter gehen soll! Wenn ich 6 Stellen gehen soll muss ich doch eigentlich 1,2,3,4,5,6 zählen, was dann der 0 entsprechen würde, oder?



  • In deinem Array steht doch aber nur:

    | 0   1   2   3   4   5 | 6   7   8   9   10  11
    ------------------------------------------------- 
    | a | s | d | f | g | 0 | q | w | e | r | 0 |   |
    -------------------------------------------------
    |<-p                    |<-q
    

    Und q = p + 6;



  • 0, 1, 2, 3, 4, 5



  • Wenn ich von der 0 anfange zu 6 stellen nach hinten zu zählen, dann lande ich bei der \0. Ich will aber zum 'q'... Wenn ich zähle 0,1,2,3,4,5,6 dann hab ich aber 7 stellen weiter gemacht und soll aber nur 6 allerdings bin ich dann bei der richtigen stelle!

    Das verstehe ich nicht...



  • Ist das den garantiert, dass die Speicherbereiche direkt hintereinander liegen? Oder kann der Speicher nicht auf vier Byte ausgerichtet sein? Am besten du vergleichst die Adressen.



  • Ich mach doch hier speicherzugriffe auf ein char array und die sind doch immer ein byte groß und da es hier ein statisches array ist müssen doch die chars auch hintereinander im speiche rliegen



  • Jetzt verstehe ich, was du willst. 😃
    Du zählst ja auch die Schritte bis dorthin. Bei null Schritten trittst du auf dem Fleck und bei 6, landest du auf dem 7 Platz. Verständlicher?



  • Man Bandchef! Ist Plusrechnen so schwer?

    Was gibt: p = p + 0? Natürlich p! welches 'a' ist.
    Was gibt: p = p + 1? 's'
    Was gibt: p = p + 2? 'd'
    Was gibt: p = p + 3? 'f'
    Was gibt: p = p + 4? 'g'
    Was gibt: p = p + 5? '0'
    Was gibt: p = p + 6? 'q'

    Ich verzweifel gelich, hilfe! 😃

    Nimms mir nicht übel 😉



  • Wenn ich mir nun die Adressen ausgeben lasse, dann erscheint folgendes:

    3DFD4C - 3DFD52

    sind also tatsächlich 6 adressen...

    Aber warum lande ich dann beim 'q' anstatt beim \0? Ich verstehs einfach nicht... Damit ich das auf meiner Skizze tu, muss ich 7(!) Schritte gehen... Nicht 6...


Anmelden zum Antworten