[xpert.press] moderne c-programmierung || sequenzpunkt-regeln

2
16 Sequenzpunkt-Regeln Ein Sequenzpunkt schließt alle eventuell noch ausstehenden schwebenden Operatio- nen ab. Zwischen zwei Sequenzpunkten darf nur ein Schreibzugriauf ein und dasselbe Objekt stattfinden. Falls hier neben einem Schreibzugrizusätzlich Lesezugrie auf dies Objekt vorhanden sind, müssen alle diese Lesezugrie (auch) der Ermittlung des neuen Wertes dieses Objekts dienen. Sequenzpunkte sind zeitliche Punkte, keine positionalen Punkte. Bei Inkrement/Dekrement (++ --) finden jeweils ein Lese- und ein Schreibzu- gristatt. Sequenzpunkte sind: ; , && || ? Funktionsaufrufe (der call-Zeitpunkt). Direkt vor der Rückkehr von Library-Funktionen. Das Ende vollständiger Ausdrücke: if (...) while (...) for (...; ...; ...) switch (...) Dieses Thema ist im Standard-Dokument enorm umfangreich, sehr verteilt und schwer lesbar. Dennoch reicht diese knappe Zusammenfassung eigentlich aus. Pro- bleme mit Sequenzpunkten treten in der Praxis fast nur im Zusammenhang mit ++ -- und bei Funktionsargumenten (falls diese dort geändert werden) auf. H. Schellong, Moderne C-Programmierung, Xpert.press, DOI 10.1007/978-3-642-40058-2_16, © Springer-Verlag Berlin Heidelberg 2013

Upload: helmut

Post on 10-Dec-2016

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: [Xpert.press] Moderne C-Programmierung || Sequenzpunkt-Regeln

16

Sequenzpunkt-Regeln

Ein Sequenzpunkt schließt alle eventuell noch ausstehenden schwebenden Operatio-nen ab.

• Zwischen zwei Sequenzpunkten darf nur ein Schreibzugriff auf ein und dasselbeObjekt stattfinden.

• Falls hier neben einem Schreibzugriff zusätzlich Lesezugriffe auf dies Objektvorhanden sind, müssen alle diese Lesezugriffe (auch) der Ermittlung des neuenWertes dieses Objekts dienen.

• Sequenzpunkte sind zeitliche Punkte, keine positionalen Punkte.

• Bei Inkrement/Dekrement (++ --) finden jeweils ein Lese- und ein Schreibzu-griff statt.

• Sequenzpunkte sind:

– ; ,

– && ||

– ?

– Funktionsaufrufe (der call-Zeitpunkt).

– Direkt vor der Rückkehr von Library-Funktionen.

– Das Ende vollständiger Ausdrücke:if (...) while (...)for (...; ...; ...) switch (...)

Dieses Thema ist im Standard-Dokument enorm umfangreich, sehr verteilt undschwer lesbar. Dennoch reicht diese knappe Zusammenfassung eigentlich aus. Pro-bleme mit Sequenzpunkten treten in der Praxis fast nur im Zusammenhang mit++ -- und bei Funktionsargumenten (falls diese dort geändert werden) auf.

H. Schellong, Moderne C-Programmierung, Xpert.press,DOI 10.1007/978-3-642-40058-2_16, © Springer-Verlag Berlin Heidelberg 2013

Page 2: [Xpert.press] Moderne C-Programmierung || Sequenzpunkt-Regeln

118 16 Sequenzpunkt-Regeln

Hinweise:

• Die Kommata, die die Argumente bei Funktionsaufrufen trennen, sind keine Se-quenzpunkte!

• Zuweisungsoperatoren (= += etc.) sind leider keine Sequenzpunkte!

• Die Reihenfolge der Berücksichtigung von Funktionsargumenten ist beliebig!

Merksatz:

Sobald irgendwo zwischen zwei Sequenzpunkten ein und dasselbe Objekt mehr alseinmal vorkommt und irgendein Schreibzugriff darauf stattfindet, sollte man genauprüfen!

Beispiele:

arr[x][x++];

Lesezugriff dient nicht der Ermittlung des neuen x-Wertes!

a = i++ - i + b;

Lesezugriff dient nicht der Ermittlung des neuen i-Wertes!

i = ++i + 1;

Mehr als ein Schreibzugriff!

funktion(++i, i, a);

Zwei Werte möglich beim 2. Argument! (Reihenfolge)Und: Lesezugriff dient nicht . . .

funktion(a+4, a=b+1, c);

Zwei Werte möglich beim 1. Argument! (Reihenfolge)Und: Lesezugriff dient nicht . . .

y += y * y;

Ein Schreibzugriff, jedes Lesen (3x) dient dem neuen Wert.OKAY!