Ключевой момент: оператор инкремента (увеличения) (++) и оператор декремента (уменьшения) (—) предназначены для увеличения и уменьшения переменной на 1.
Два сокращённых оператора ++ и — используются для прибавления или вычитания единицы. Это удобно, потому что часто во многих задачах программирования необходимо изменить значение именно не единицу. Например, следующий код увеличивает i на 1 и уменьшает j на 1.
int i = 3, j = 3; i++; // i становится 4 j--; // j становится 2
i++ произносится как i плюс плюс, а i— как i минус минус. Эти операторы известны как постфиксный инкремент (или постинкремент) и постфиксный декремент (или постдекремент), поскольку операторы ++ и — размещаются после переменной. Эти операторы также могут быть размещены перед переменной, например:
int i = 3, j = 3; ++i; // i становится 4 --j; // j становится 2
++i увеличивает i на 1, а —j уменьшает j на 1. Эти операторы известны как префиксный инкремент (или преинкремент) и префиксный декремент (или предекремент).
Как вы можете видеть, в предыдущих примерах эффект i++ и ++i или i— и —i одинаковый. Тем не менее, их эффекты различны, когда они используются в инструкциях, делающих что-то большее чем простое увеличение или уменьшение на единицу. Следующая таблица описывает их различия и даёт примеры:
Оператор | Имя | Описание | Пример (подразумевается, что i = 1) |
---|---|---|---|
++var | преинкремент | Увеличивает var на 1 и использует новое значение var в инструкции |
int j = ++i; // j равно 2, i равно 2 |
var++ | постинкремент | Увеличивает var на 1 и использует изначальное значение var в инструкции |
int j = i++; // j равно 1, i равно 2 |
—var | предекремент | Уменьшает var на 1 и использует новое значение var в инструкции |
int j = —i; // j равно 0, i равно 0 |
var— | постдекремент | Уменьшает var на 1 и использует изначальное значение var в инструкции |
int j = i—; // j равно 1, i равно 0 |
Дополнительные примеры для иллюстрации различий между префиксной формой ++ (или —) и постфиксной формой ++ (или —). Рассмотрим следующий код:
int i = 10; int newNum = 10 * i++;
Он даёт точно такой же эффект как и код:
int newNum = 10 * i; i = i + 1;
Т.е. i в итоге равняется 11, а newNum равняется 100.
В этом случае i увеличивается на 1, затем старое значение i используется для умножения. Поэтому newNum становится 100. Если i++ заменить на ++i следующим образом:
int i = 10; int newNum = 10 * (++i);
То этот код будет эквивалентом следующего:
i = i + 1; int newNum = 10 * i;
Т.е. теперь в конечном счёте i равно 11, а newNum равно 110.
i увеличена на 1, и в умножении используется новое значение i. Поэтому значение newNum становится 110.
Вот другие примеры:
double x = 1.0; double y = 5.0; double z = x-- + (++y);
После выполнения всех трёх строк, y становится 6.0, z становится 7.0, а x становится 0.0.
Совет: использование операторов инкремента и декремента делает выражения короткими, но также делает их сложными и трудными для чтения. Избегайте использование этих операторов в выражениях, которые изменяют несколько переменных или одну и ту же переменную несколько раз, примерно так: int k = ++i + i.
Проверь себя:
- Какие из этих утверждений верны?
a. Любое выражение может использоваться как инструкция языка.
b. Выражение x++ может использоваться как инструкция.
c. Инструкция x = x + 5 также является выражением.
d. Инструкция x = y = x = 0 неправильна.
- Покажите вывод следующего кода:
int a = 6; int b = a++; System.out.println(a); System.out.println(b); a = 6; b = ++a; System.out.println(a); System.out.println(b);