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
-
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?
-
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.