Efekty uboczne
Kolejność obliczania wyrażeń jest definiowana przez określoną implementację, z wyjątkiem sytuacji, gdy język gwarantuje określoną kolejność oceny (jak opisano w temacie Pierwszeństwo i Kolejność oceny). Na przykład skutki uboczne występują w następujących wywołaniach funkcji:
add( i + 1, i = j + 2 );
myproc( getc(), getc() );
Argumenty wywołania funkcji można ocenić w dowolnej kolejności. Wyrażenie i + 1
może zostać obliczone przed wartością i = j + 2
lub i = j + 2
może zostać obliczone przed i + 1
. Wynik jest inny w każdym przypadku. Podobnie nie można zagwarantować, jakie znaki są rzeczywiście przekazywane do .myproc
Ponieważ operacje przyrostowe i dekrementacji jednoargumentowej obejmują przypisania, takie operacje mogą powodować skutki uboczne, jak pokazano w poniższym przykładzie:
x[i] = i++;
W tym przykładzie wartość x
, która jest modyfikowana, jest nieprzewidywalna. Wartość indeksu dolnego może być nową lub starą wartością i
. Wynik może się różnić w różnych kompilatorach lub różnych poziomach optymalizacji.
Ponieważ język C nie definiuje kolejności oceny skutków ubocznych, obie metody oceny omówione powyżej są poprawne i można je wdrożyć. Aby upewnić się, że kod jest przenośny i przejrzysty, unikaj instrukcji, które zależą od określonej kolejności oceny skutków ubocznych.