Parameterübergabe mit Referenzen
-
camper schrieb:
funktioniert gar nicht wegen fehlender sequence points.
ich glaube, in diesem fall ist dem nicht so, da keine variable 2mal verändert wird:
x=(y=(x^=y));
bin mir aber nimmer sicher wegen der genauen regeln.
-
x wird zweimal verändert
-
...der XOR-Tausch nicht mit doubles.
-
camper schrieb:
x wird zweimal verändert
...speziellen Fall ist das aber egal.
-
In diesem... schrieb:
camper schrieb:
x wird zweimal verändert
...speziellen Fall ist das aber egal.
erklärung? das hier ist unzweifelhaft undefiniertes verhalten.
es ist nicht klar ob das äussere xor mit dem originalen x oder dem veränderten x rechnet und es ist auch nicht klar, welche der beiden veränderungen die letzte ist - allein aus dieser sicht sind schon 4 verschiedene szenarios denkbar. die reihenfolge von speicherzugriffen ist kein beobachtbares verhalten (es sei denn, die variablen sind volatile) und sie dürfen ohne weiteres erst nach der kompletten auswertung des ausdruckes stattfinden.
-
es ist nicht klar ob das äussere xor mit dem originalen x oder dem veränderten x rechnet
es rechnet nachd en regeln der rechenkunst mit dem veränderten x. immer. der in den von mir geetzten klammern innerste operator wird auch zuerst aufgerufen!
-
..im Prototypen überhaupt Variablennamen zu verwenden halte ich nicht für optimal. Führt in der Regel nur zu Missverständnissen.
Von Bedeutung ist ja eh nur die Reihenfolge der Parameter und deren Typ.
-
otze schrieb:
es ist nicht klar ob das äussere xor mit dem originalen x oder dem veränderten x rechnet
es rechnet nachd en regeln der rechenkunst mit dem veränderten x. immer. der in den von mir geetzten klammern innerste operator wird auch zuerst aufgerufen!
mit den regeln der erchenkunst hat das nichts zu tun. und dass ^= rechts-assoziativ ist, steht auch nicht zur debatte. der rechte operand des äusseren (d.h. des linken) xor ist eindeutig, aber der linke operand ist es nicht. der compiler könnte z.b. die logik einer einfacher stackmaschine anwenden: linken operanden ermitteln (also das ursprüngliche x), auf den stack pushen, rechten operanden ermitteln, dann verknüpfen. er könnte auch den ausdruck gleich von rechts her auswerten. der standard ist hier ganz eindeutig - er lässt das nähmlich offen (unspecified).
-
Ausserdem geht... schrieb:
...der XOR-Tausch nicht mit doubles.
Kannst ja die Werte mit gleichwertigen Ganzzahltypen reinterpretieren.
-
...etc schrieb:
..im Prototypen überhaupt Variablennamen zu verwenden halte ich nicht für optimal. Führt in der Regel nur zu Missverständnissen.
Von Bedeutung ist ja eh nur die Reihenfolge der Parameter und deren Typ.
Ganz im Gegenteil würde ich das auf jeden Fall machen. Wenn du mal wieder eine tolle WinAPI-Funktion mit 10 Parametern hast, die alle vom Typ int sind, bist du froh wenn da auch was wie "x", oder "len" steht...
MfG SideWinder