Punkty sekwencji języka C
Między kolejnymi "punktami sekwencji" wartość obiektu może być modyfikowana tylko raz przez wyrażenie. Język C definiuje następujące punkty sekwencji:
Lewy operand operatora logicznego AND (&&). Lewy operand operatora logicznego AND jest całkowicie oceniany, a wszystkie skutki uboczne zostaną ukończone przed kontynuowaniem. Jeśli lewy operand daje wartość false (0), inny operand nie jest obliczany.
Lewy operand operatora logicznego OR (
||
). Lewy operand operatora logicznego OR jest całkowicie oceniany, a wszystkie skutki uboczne zostaną ukończone przed kontynuowaniem. Jeśli lewy operand zwraca wartość true (nonzero), inny operand nie jest obliczany.Lewy operand operatora przecinka. Lewy operand operatora przecinka jest całkowicie oceniany i wszystkie skutki uboczne są kompletne przed kontynuowaniem. Oba operandy operatora przecinka są obliczane zawsze. Należy pamiętać, że operator przecinka w wywołaniu funkcji nie gwarantuje kolejności oceny.
Operator wywołania funkcji. Wszystkie argumenty funkcji są oceniane i wszystkie skutki uboczne zostaną ukończone przed wejściem do funkcji. Nie określono kolejności oceny między argumentami.
Pierwszy operand operatora warunkowego. Pierwszy operand operatora warunkowego jest całkowicie oceniany i wszystkie skutki uboczne zostaną ukończone przed kontynuowaniem.
Koniec pełnego wyrażenia inicjalizacji (czyli wyrażenie, które nie jest częścią innego wyrażenia, takiego jak koniec inicjowania w instrukcji deklaracji).
Wyrażenie w instrukcji wyrażenia. Instrukcje wyrażeń składają się z wyrażenia opcjonalnego, po którym następuje średnik (;). Wyrażenie jest oceniane pod kątem skutków ubocznych i istnieje punkt sekwencji po tej ocenie.
Wyrażenie sterujące w instrukcji selection (
if
lubswitch
) . Wyrażenie jest obliczane całkowicie i wszystkie skutki uboczne są wykonywane przed wykonaniem kodu zależnego od zaznaczenia.Wyrażenie sterujące instrukcji
while
ordo
. Wyrażenie jest obliczane całkowicie i wszystkie efekty uboczne zostaną wykonane przed wykonaniem jakichkolwiek instrukcji w następnejwhile
iteracji lubdo
pętli.Każde z trzech wyrażeń instrukcji
for
. Wyrażenia są obliczane całkowicie i wszystkie skutki uboczne zostaną wykonane przed wykonaniem jakichkolwiek instrukcji w następnejfor
iteracji pętli.Wyrażenie w instrukcji
return
. Wyrażenie jest obliczane całkowicie, a wszystkie skutki uboczne są kompletne przed powrotem kontrolki do funkcji wywołującej.