Поделиться через


Побочные эффекты

Порядок вычисления выражений определяется конкретной реализацией, за исключением случаев, когда язык гарантирует определенный порядок вычислений (как описано в статье Приоритет и порядок оценки). Например, в следующих вызовах функций возникают побочные эффекты:

add( i + 1, i = j + 2 );
myproc( getc(), getc() );

Аргументы вызова функции могут вычисляться в любом порядке. Выражение i + 1 может вычисляться до выражения i = j + 2 или выражение i = j + 2 может вычисляться до выражения i + 1. В каждом случае результат будет различным. Аналогично, невозможно гарантировать, какие символы фактически будут переданы в myproc. Поскольку унарные операции инкремента и декремента связаны с присваиваниями, такие операции могут вызывать побочные эффекты, как показано в следующем примере:

x[i] = i++;

В этом примере значение изменяемой переменной x непредсказуемо. Значение индекса может быть как новым, так и старым значением переменной i. Результат может отличаться в различных компиляторах или при разных уровнях оптимизации.

Поскольку язык C не определяет порядок вычисления побочных эффектов, оба приведенных выше метода вычисления правильны и оба могут быть реализованы. Чтобы обеспечить переносимость и понятность кода, не используйте операторы, зависящие от конкретного порядка вычисления побочных эффектов.

См. также

Вычисление выражений