Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.