Efekty uboczne

Kolejność obliczania wyrażeń jest definiowana przez konkretną implementację, z wyjątkiem sytuacji, gdy język gwarantuje określoną kolejność oceny (zgodnie z opisem 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 być obliczane przed wartością i = j + 2lub 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.

Zobacz też

Obliczanie wyrażeń