Материал предоставлен https://it.rfei.ru

Операторы инкремента и декремента

Операторы инкремента (++) и декремента (--) были представлены в главе Основные элементы языка C#. Как станет ясно в дальнейшем, они обладают рядом особых и довольно интересных свойств. Но сначала выясним основное назначение этих операторов.

Оператор инкремента увеличивает свой операнд на 1, а оператор декремента уменьшает операнд на 1. Следовательно, оператор x++ ; равнозначен оператору x = x + 1;, а оператор x--; равносилен оператору x = x - 1;

Следует, однако, иметь в виду, что в инкрементной или декрементной форме значение переменной x вычисляется только один, а не два раза. В некоторых случаях это позволяет повысить эффективность выполнения программы.

Оба оператора инкремента и декремента можно указывать до операнда (в префиксной форме) или же после операнда (в постфиксной форме). Например, оператор

x = x + 1;

может быть записан в следующем виде:

++x;  // префиксная форма

или же в таком виде:

x++;  // постфиксная форма

В приведенном выше примере форма инкремента (префиксная или постфиксная) особого значения не имеет. Но если оператор инкремента или декремента используется в длинном выражении, то отличие в форме его записи уже имеет значение. Когда оператор инкремента или декремента предшествует своему операнду, то результатом операции становится значение операнда после инкремента или декремента. А когда оператор инкремента или декремента следует после своего операнда, то результатом операции становится значение операнда до инкремента или декремента. Рассмотрим следующий фрагмент кода.

x = 10;
x = ++x;

В данном случае значение переменной y будет установлено равным 11, поскольку значение переменной x сначала увеличивается на 1, а затем присваивается переменной y. Но во фрагменте кода

x = 10;
y = x++;

значение переменной y будет установлено равным 10, так как в этом случае значение переменной x сначала присваивается переменной y, а затем увеличивается на 1. В обоих случаях значение переменной x оказывается равным 11. Отличие состоит лишь том, когда именно это значение станет равным 11: до или после его присваивания переменной y.

Возможность управлять моментом инкремента или декремента дает немало преимуществ при программировании. Обратимся к следующему примеру программы, в которой формируется последовательный ряд чисел.

// Продемонстрировать отличие между префиксной

// и постфиксной формами оператора инкремента  (++).

using System;

class PrePostDemo {
  static void Main() {
    int x, y;
    int i;

    x = 1;
    y = 0;
    Console.WriteLine("Ряд чисел,  полученных " +
                      "с помощью оператора y = y + x++;");
    for (i = 0; i < 10; i++) {
      y = y + x++;  // постфиксная форма оператора ++
      Console.WriteLine(y + " ");
    }

    Console.WriteLine();

    x = 1;
    y = 0;
    Console.WriteLine("Ряд чисел,  полученных " +
                      "с помощью оператора y = y + ++x;");

    for (i = 0; i < 10; i++) {
      y = y + ++x;  // префиксная форма оператора ++
      Console.WriteLine(y + " ");
    }
    Console.WriteLine();
  }
}

Выполнение этой программы дает следующий результат.

Ряд чисел,  полученных с помощью оператора y = y + x++
1
3
6
10
15
14
21
28
36
45
55

Ряд чисел,  полученных с помощью оператора y = y + ++x;
2
5
9
14
20
27
35
44
54
65

Как подтверждает приведенный выше результат, в операторе

y = y + x++;

первоначальное значение переменной x складывается с самим собoй, а полученный результат присваивается переменной y. После этого значение переменной x увеличивается на 1. Но в операторе

y = y + ++x;

значение переменной x сначала увеличивается на 1, затем складывается с первоначальным значением этой же переменной, а полученный результат присваивается переменной y. Как следует из приведенного выше результата, простая замена префиксной формы записи оператора ++х постфиксной формой х++ приводит к существенному изменению последовательного ряда получаемых чисел.

И еще одно замечание по поводу приведенного выше примера: не пугайтесь выражений, подобных следующему:

y + ++x

Такое расположение рядом двух операторов может показаться не совсем привычным, но компилятор воспримет их в правильной последовательности. Нужно лишь запомнить, что в данном выражении значение переменной y складывается с увеличенным на 1 значением переменной x.

Арифметические операторыОператоры отношения и логические операторы