[xpert.press] moderne c-programmierung || sequenzpunkt-regeln
TRANSCRIPT
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
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!