Поиск…


Операторы 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;
    }


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow