Operatorzusammenfassung
-
Hallo zusammen,
kann mir vielleicht irgend jemand sagen warum
int i=1;
v[i]=i++;nicht definiert ist? also zum Ergibnis v[1]=1 oder v[2]=1 führen kann.
Denn Beispielsweise *p++ = *c++; führt auch dazu dass zuerst *p und *c dereferenziert und dann zugewiesen wird. Und erst anschließen wird beides Inkriementiert. Oder seh ich das alles irgendwie falsch?
-
TomTom85 schrieb:
Denn Beispielsweise *p++ = *c++; führt auch dazu dass zuerst *p und *c dereferenziert und dann zugewiesen wird. Und erst anschließen wird beides Inkriementiert. Oder seh ich das alles irgendwie falsch?
das ist ein trugschlusss. es ist keineswegs definiert in welcher reihenfolge diese operationen ablaufen (soweit sie nicht voneinander abhängen). es passieren diese dinge:
(1) c wird dereferenziert
(2) der wert an *c wird gelesen
(3) p wird dereferenziert
(4) der wert aus (2) wird in *p geschrieben
(5) der wert c wird erhöht
(6) der erhöhte wert wird in c geschrieben
(7) der wert p wird erhöht
(8) der erhöhte wert wird in p geschrieben
was wir wissen ist, dass (2) nach (1), (4) nach (2) und (3), (6) nach (5) und (8) nach (7) stattfindet. alles andere ist der implementation völlig frei überlassen mit der maßgabe, dass (1) und (3) stets mit dem ursprünglichen wert arbeiten, unabhängig ob (6) oder (8) schon stattgefunden haben. der ausdruck wäre im übrigen undefiniert, falls p ein alias auf c ist.
-
Gut! Aber das müsste ja dann heißen, dass v[i]=i++; ebenfalls mit dem alten wert von i rechnet. Also v[1]=1! Laut Stroustrup aber ist dieser Fall undefiniert. Also v[2]=1; ist ebenfalls möglich. Und das schließen deine Regeln aus und mein momentaner Kenntnisstand ebenfals.
-
TomTom85 schrieb:
Gut! Aber das müsste ja dann heißen, dass v[i]=i++; ebenfalls mit dem alten wert von i rechnet.
auf der rechten seite, ja. es ist ja nichts anderes als:
(*(v+i)) = (i++) bzw. (v.operator[](i)) = (i++)das ergebnis des postfix operators ist stets der ursprungliche wert unabhängig davon, wann die erhöhung der variablen erfolgt. das i auf der linken seite ist davon völlig unabhängig. die regel, die daraus folgt, ist, dass eine variable, die ihren wert zwischen sequence points ändert, nur gelesen werden darf, um den folgewert zu ermitteln. in obigem ausdruck ist das nicht der fall. das i für den index operator wird irgendwann bevor, nachdem oder während i inkrementiert wird (letzteres muss ja kein atomarer vorgang sein) ermittelt. tatsächlich muss der wert, der auf der linken seite ermittelt wirde, überhaupt nichts mit i zu tun haben.
-
Ahja.. jetzt macht das Sinn! Danke für deine Bemühungen