Präzedenz und Assoziativität



  • Hallo Leute,

    ich soll bei zwei Aufgaben die Präzedenz und die Assoziativität bestimmen.
    Also das selbe was der Compiler tun würde.

    [1]
    1.1 a = b >> 2 + 4;
    1.2 a = b && a >> z ? x = y : z;
    
    [2]
    
    extern int f(int);
    
    2.1 a = b * c == 2;
    2.2 a = f(x) && a > 100;
    2.3 a == b && x != y;
    2.4 a = b += 2 + f(2);
    

    Meine Lösung:

    1.1 ((a=b)>>2)+4)
    1.2 (((a=b)&&a)>>(z?(x=y)):z))
    
    2.1 ((a=b)*(c==2))
    2.2 ((a=f(x))&& a)>100))
    2.3 (a==(((b&&x)!=y)))
    2.4 ((a=(b+=2))+f(2))
    

    Stimmt meine Lösung?

    Und noch eine Frage hätte ich: Kennt ihr eine Seite da wo das casten des Compilers aufgelistet ist. Wie der Compiler castet.

    Danke für eure Hilfe

    Gruß

    rubix



  • rubix schrieb:

    Stimmt meine Lösung?

    Nein, eigentlich ist alles falsch. Nur 2.3 ist richtig, wenn ich das richtig sehe. Vielleicht erklärst du mal bei z.B. 1.1, wie du auf die Klammersetzung gekommen bist.

    edit: 2.3 ist auch falsch 🙂



  • rubix schrieb:

    [1]
    1.1 a = b >> 2 + 4;
    
    1.1 ((a=b)>>2)+4)
    

    Meine Lösung:

    1.1 (a=(b>>(2+4)))
    

    http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
    Wenn du nach so eine Liste vorgegangen bist, hast du es umgekehrt gemacht.



  • Schau dir mal die Liste an.

    Zu 1.1:

    a = b >> 2 + 4;
    

    Das Plus hat die höchste Priorität, wird also als erstes ausgewertet.
    Es folgt der Shift und mit niedrigster Priorität die Zuweisung.

    (a = (b >> (2 + 4)));
    

    Rest versuch mal selbst und zeig, was du hast.



  • 1.1
    Hier das Bild dazu
    http://s14.directupload.net/images/130718/vhq5azdq.jpg

    + ist binär, auch wenns unär wäre, stünde es trotzdem an erster stelle.
    dann komm von der präzidenz >>
    und dann erst =

    Also verstehe nicht warum ihr das als falsch ansehts



  • rubix schrieb:

    Hier das Bild dazu

    Der Baum ist genau falschrum. Nach deinem Baum fließt das Ergebnis der Zuweisung in den Shift, und dessen Ergebnis in die Addition.

    rubix schrieb:

    Also verstehe nicht warum ihr das als falsch ansehts

    Weil nach deiner Klammerung = zuerst ausgeführt würde.



  • Nach deinem Bild würde a alleine b zugewiesen, anschließend der Wert von a um 2 Stellen nach rechts geshiftet und zum Schluss mit 4 addiert werden. Du musst allerdings den Baum umdrehen, um der richtigen Auswertungsreihenfolge nachzukommen.
    a weise zu b geshiftet um 2 addiert mit 4



  • Neue Lösung

    1.1 (a=(b>>(2+4)))
    1.2 (((a=b)&&a)>>z)?(x=y)):z)

    2.2 (a=(f(x)&&(a>100)))
    2.3 (a==b) && (x!=y)
    2.4 (a=(b+=(2+f(2)))

    Bei der 2.1 habe ich leider keine Lösung gefunden 😞


  • Mod

    1.1: Richtig.
    1.2: Völliger Unsinn
    2.2: Richtig.
    2.3: Richtig.
    2.4: Richtig.



  • SeppJ schrieb:

    1.1: Richtig.
    1.2: Völliger Unsinn
    2.2: Richtig.
    2.3: Richtig.
    2.4: Richtig.

    könntest du bitte erklären warum 1.2 Völliger Unsinn ist?


  • Mod

    rubix schrieb:

    könntest du bitte erklären warum 1.2 Völliger Unsinn ist?

    Das fängt halt schon wieder an, dass da (a=b) als innerstes steht, obwohl '=' einer der am schwächten bindenden Operatoren ist. Danach ist der Rest dann auch völlig falsch, weil einfach gar nichts mehr passt, wenn das b weg ist.



  • Na, 2.1 ist nicht schwer.

    Youka schrieb:

    Schau dir mal die Liste an.

    Geh die Liste von oben nach unten durch und such dabei die Operatoren in deiner Zeile raus.

    Genauso verfährst du nun mit 1.2.


Log in to reply