Побочные эффекты
Порядок вычисления выражений определяется конкретной реализацией, за исключением случаев, когда язык гарантирует определенный порядок вычислений (как описано в статье Приоритет и порядок оценки). Например, в следующих вызовах функций возникают побочные эффекты:
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 не определяет порядок вычисления побочных эффектов, оба приведенных выше метода вычисления правильны и оба могут быть реализованы. Чтобы обеспечить переносимость и понятность кода, не используйте операторы, зависящие от конкретного порядка вычисления побочных эффектов.