Ist das definiert? a = b[++i] + 2*b[++i];
-
kwt.
-
Welches von beiden 'i' zuerst erhöht wird ist nach dem Standard nicht definiert, da kein Sequenzpunkt vorliegt.
Du solltest also solchen Code nicht erzeugen...
Du kannst ihn aber dann auf 2 Zuweisungen aufteilen:a = b[++i]; a += 2*b[++i];
-
Ist das nicht, wie beim || Operator?
-
ProgChild schrieb:
Ist das nicht, wie beim || Operator?
Nein. Bei || und && ist die Reihenfolge definiert und bei obengenanntem Konstrukt nicht.
-
simon.gysi schrieb:
Nein. Bei || und && ist die Reihenfolge definiert
Allerdings auch nur beim builtin bool vs. bool. Bei einem op&& (oder op||) Marke Eigenbau ist die Reihenfolge auch nicht definiert.
-
ja, richtig. ein guter grund um || oder && nicht zu überladen.
-
simon.gysi schrieb:
ja, richtig. ein guter grund um || oder && nicht zu überladen.
it depends.
[in expression templates kann man dieses verhalten perfekt nachbilden, also ist es dort kein problem]
-
hmm ich dachte nach
b[++i] ist das i erhöht
2*b[++i] und wird dann hier nochmal erhöht
aus beiden termen dann die summe
-
Es ist dem Compiler freigestellt, in welcher Reihenfolge er die Argumente des operator+ auswertet. Er macht intern also sowas:
pseudocode
//erste Möglichkeit, Auswertung links nach rechts inc i tmp1 = b[i] inc i tmp2 = 2*b[i] a = tmp1+tmp2 //zweite Möglchkeit, Auswertung rechts nach links inc i tmp1 = 2*b[i] inc i tmp2 = b[i] a = tmp1+tmp2Welche von beiden Möglichkeiten sich der Compiler aussucht ist nicht definiert
-
In diesem Fall gibt es nicht nur zwei Möglichkeiten, sondern beliebig viele, da das Verhalten nicht unspezifiziert, sondern wegen der mehrfachen Modifikation von i sogar undefiniert ist.
-
hmm ... ich ich dachte damals im studium gelernt zu haben, das die abarbeiten von operationen links nach rechts läuft, wo bei die prioritäten noch geregelt sind bspw. & und * sowieso an erster stelle.. punkt vor stricht etc.
aber ist wohl compiler abhänging;)
-
BorisDieKlinge schrieb:
hmm ... ich ich dachte damals im studium gelernt zu haben, das die abarbeiten von operationen links nach rechts läuft, wo bei die prioritäten noch geregelt sind bspw. & und * sowieso an erster stelle.. punkt vor stricht etc.
Du verwechselst hier was: bei a() + b() * c() wird natürlich zuerst das Ergebnis von b() mit dem von c() multipliziert, bevor das von a() dazu addiert wird. Aber dennoch könnte es sein, dass die Funktion a() vor der Funktion c() vor der Funktion b() aufgerufen wird.
-
***