Операторы инкремента (++
) и декремента (--
) были представлены в главе Основные элементы языка 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
.
Арифметические операторы | Операторы отношения и логические операторы |