НазадОглавлениеДалее

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

Побочный эффект выражается в неявном изменении значения переменной в процессе вычисления выражения. Все операции присваивания могут вызывать побочный эффект. Вызов функции, в которой изменяется значение какой-либо внешней переменной, либо путем явного присваивания, либо через указатель, также имеет побочный эффект.

Порядок вычисления выражения зависит от реализации компилятора, за исключением случаев, в которых явно гарантируется определенный порядок вычислений (см. раздел 4.5). При вычислении выражения в языке Си существуют так называемые контрольные точки. По достижении контрольной точки все предшествующие вычисления, в том числе все побочные эффекты, гарантированно произведены. Контрольными точками являются операция последовательного вычисления, условная операция, логические операции И и ИЛИ, вызов функции. Другие контрольные точки:
- конец полного выражения (т.е. выражения, которое не является частью другого выражения);
- конец инициализирующего выражения для переменной класса памяти auto;
- конец выражений, управляющих выполнением операторов if, switch, for, do, while и выражения в операторе return.

Приведем примеры побочных эффектов:
add(i+1, i=j+2);

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

Унарные операции инкремента и декремента также содержат в себе присваивание и могут быть причиной побочных эффектов, как это показано в следующем примере:
int i, a[10];
i=0;
a[i++]=i;

Неизвестно, какое значение будет присвоено элементу а[0] - нуль или единица, поскольку для операции присваивания порядок вычисления аргументов не оговаривается.


НазадОглавлениеДалее