C Language
Побочные эффекты
Поиск…
Операторы Pre / Post Increment / Decrement
В C есть два унарных оператора - «++» и «-», которые являются очень распространенным источником путаницы. Оператор ++
называется оператором приращения, а оператор --
называется декрементом . Оба они могут использоваться как в префиксной форме, так и в форме постфикса . Синтаксис префикса формы ++
оператора ++operand
и синтаксис формы постфикса является operand++
. При использовании в форме префикса операнд увеличивается сначала на 1
а результирующее значение операнда используется при оценке выражения. Рассмотрим следующий пример:
int n, x = 5;
n = ++x; /* x is incremented by 1(x=6), and result is assigned to n(6) */
/* this is a short form for two statements: */
/* x = x + 1; */
/* n = x ; */
При использовании в постфиксной форме в выражении используется текущее значение операнда, а затем значение операнда увеличивается на 1
. Рассмотрим следующий пример:
int n, x = 5;
n = x++; /* value of x(5) is assigned first to n(5), and then x is incremented by 1; x(6) */
/* this is a short form for two statements: */
/* n = x; */
/* x = x + 1; */
Рабочий оператор декремента --
можно понимать аналогичным образом .
Следующий код демонстрирует, что каждый делает
int main()
{
int a, b, x = 42;
a = ++x; /* a and x are 43 */
b = x++; /* b is 43, x is 44 */
a = x--; /* a is is 44, x is 43 */
b = --x; /* b and x are 42 */
return 0;
}
Из вышесказанного ясно, что пост-операторы возвращают текущее значение переменной, а затем изменяют его, но операторы pre модифицируют переменную, а затем возвращают измененное значение.
Во всех версиях C порядок оценки операторов pre и post не определен, поэтому следующий код может возвращать неожиданные выходы:
int main()
{
int a, x = 42;
a = x++ + x; /* wrong */
a = x + x; /* right */
++x;
int ar[10];
x = 0;
ar[x] = x++; /* wrong */
ar[x++] = x; /* wrong */
ar[x] = x; /* right */
++x;
return 0;
}
Обратите внимание, что также рекомендуется использовать pre over post-операторы, когда они используются отдельно в инструкции. Посмотрите на приведенный выше код для этого.
Также обратите внимание, что при вызове функции все побочные эффекты для аргументов должны выполняться до запуска функции.
int foo(int x)
{
return x;
}
int main()
{
int a = 42;
int b = foo(a++); /* This returns 43, even if it seems like it should return 42 */
return 0;
}