Udostępnij za pośrednictwem


Efekty uboczne

Kolejność oceny wyrażeń jest zdefiniowana przez określoną implementacje, z wyjątkiem, gdy język gwarantuje określoną kolejność ocen (jak wskazano w Hierarchia i kolejność ocen).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, mogą zostać opracowane w dowolnej kolejności.Wyrażenie i + 1 może być oszacowane przed i = j + 2 lub i = j + 2 może być oceniane przed i + 1.W każdym przypadku wynik jest różny.Podobnie, nie jest możliwe zagwarantowanie, jakie znaki są faktycznie przekazywane do myproc.Ponieważ jednoskładnikowe operatory inkrementacji i dekrementacji obejmują zadania, które mogą powodować skutki uboczne, jak pokazano w następującym przykładzie:

x[i] = i++;

W tym przykładzie, wartość x , która została zmodyfikowana, jest nieprzewidywalna.Wartością indeksu dolnego może być nowa lub poprzednia wartość i.Wynik może się różnić w różnych kompilatorach lub dla różnej optymalizacji poziomów.

Ponieważ C nie definiuje kolejności oceny skutków ubocznych, obie metody oceny, omówione powyżej są poprawne i mogą być realizowane.Aby upewnić się, że kod jest przenośny i jasny, należy unikać instrukcji, które są zależne od określonej kolejności oceny dla efektów ubocznych.

Zobacz też

Koncepcje

Szacowanie wyrażeń (C)