Инкремент и декремент в Java
Инкремент и декремент в Java
Разбираемся в нюансах использования инкремента и декремента, префиксных и постфиксных вариациях и особенностях работы с отрицательными числами.
Инкремент и декремент — это специальные операторы в Java, которые позволяют одним действием увеличить или уменьшить значение переменной на одну единицу.
Инкремент увеличивает значение переменной на 1. В Java для этого используется оператор ++. Декремент уменьшает значение переменной на 1, для этого используется оператор --. Они относятся к арифметическим операторам, подробнее о них писали в статье про операторы Java.
С точки зрения программирования инкремент и декремент — это удобные и быстрые инструменты, которые легко воспринимаются на экране в массиве кода и помогают специалисту увидеть алгоритм. Эти операторы оптимально выполняются в любых машинных кодах. Поэтому код, который использует инкремент и декремент, в принципе работает быстрее, чем если мы просто напишем х = х + 1.
Инкремент и декремент позволяют кратко описать процесс увеличения или уменьшения переменной в коде. Программист видит эту конструкцию и сразу понимает, что здесь происходит. Операторы помогают сэкономить текст и уменьшить ментальную нагрузку на программиста. Также запись вида х++ показывает, что мы её применяем именно в алгоритмическом смысле, а не просто как некую арифметическую операцию.
Чтобы быстро писать код, нужно разбираться в нюансах языка и много практиковаться. На курсе «Java-разработчик» студенты изучают самые используемые инструменты, практикуются в тренажёре и участвуют в хакатонах. Первые уроки курса доступны бесплатно.
Изначально в программировании использовали только выражения вида x++ и х--. Но со временем языки стали усложняться, и программисты поняли, что не все алгоритмы удобно описать этим выражениями. В алгоритмах, которым требуются опережающее значение переменной, удобно использовать специальные префиксные операторы.
Определения «постфиксный» и «префиксный» в данных операторах обозначают конкретное расположение знаков: до или после переменной. В префиксном варианте переменная увеличивается до присвоения, а в постфиксном — после.
● Префиксные операторы ++х и --х записывают в переменную х изменённое значение и его же возвращают вместо себя в исходное выражение.
● Постфиксные операторы х++ и х-- возвращают вместо себя текущее значение переменной х, а потом записывают в х новое значение.
Например, нам нужно вывести номера строк в таблице: первая, вторая, третья и т. д. При этом нужно учитывать, что в Java нумерация списков со строками начинается с нуля. Было бы удобно, если бы мы могли увеличить переменную и получить её следующее значение за один шаг. Как раз в этой и подобной ситуациях программистов выручают префиксные операторы.
Возвращаясь к нашему примеру со списком строк: считая с нуля до конца списка, мы используем конструкцию ++х и получаем единичку. В этом смысле х++ возвращает своё значение, а потом увеличивает. Когда мы пишем ++х, мы сразу получаем следующее значение, то есть выражение увеличивает и возвращает значение поля. Это удобно: мы можем без лишних строк сразу писать номера таблиц.
Если нам нужно просто инкрементировать отдельным действием, то можно использовать стандартное выражение х++. Но если использовать выражение в алгоритмах, но необходимо обращать внимание на разницу между префиксным и постфиксным расположением знаков.
Разберём пару простых примеров использования инкремента и декремента.
В этом примере видно, что в префиксном варианте переменная увеличивается до присвоения, а в постфиксном — после.
Как и инкременты, декременты имеют свою специфику в зависимости от того, используются ли они в префиксной или постфиксной форме.
Математические операции инкремента и декремента аналогично работают и с отрицательными числами. Тут важно помнить, что когда мы увеличиваем отрицательные числа, они уменьшаются. Если нам нужен некий индекс, то, условно говоря, мы увеличиваем число, прибавляя 1, и оно уменьшается при этом в абсолютном значении.
Объясним на простом примере: когда мы говорим, что температура повышается, на самом деле отрицательное число уменьшается. То же самое происходит и с инкрементом и декрементом с отрицательными числами. Когда мы инкрементируем отрицательное число, оно увеличивается, а его значимая часть — модуль — при этом уменьшается.
Циклы в Java — это специальные конструкции, которые позволяют некие повторяющиеся операции описать один раз. Инкременты и декременты значительно упрощают работу в циклах.
Возьмём в качестве примера классическую присказку фанатичных велосипедистов: Ride — Eat — Sleep — Repeat. Это и есть цикл: несколько операций, которые повторяются ежедневно. Инкремент в этом случае не нужен — мы и так понимаем, что находимся в колесе.
Но если бы мы имели в виду план на неделю, то мы бы заложили, что у нас есть семь дней. Предположим, что у нас есть переменная, которая обозначает текущий день, — например, d. В конце цикла мы увеличиваем её номер, то есть, условно говоря, цикл увеличивается на один день.
Чтобы это сделать, нам понадобится инкремент: d++. Он позволит в каждой итерации цикла увеличить день на плюс один и таким образом пройти по всей неделе. Итерацию, соответственно, мы берём в один день.
Если бы мы хотели обозначить цикл в каждый час, мы бы написали h++ и таким образом прошли в цикле все имеющиеся в сутках 24 часа. Соответственно, один цикл был бы вложен в другой.
Основной смысл инкремента здесь — это последовательное увеличение переменных d и h, которые отвечают за день или за час в цикле внутри цикла.
В большинстве случаев инкременты и декременты используют именно в циклах. И поэтому классическая рекомендация — сначала описать цикл на бумаге, понять, как он работает, и только потом начинать писать код.
Условно говоря, у нас есть некий цикл упаковки товара: товар сначала не упакован, затем мы кладём его в коробку, потом коробку заклеиваем скотчем, клеим штрихкод с адресом получателя и т. д.
Чтобы описать такой цикл по множеству товаров, мы все стадии изменений выписываем в столбик, а в колонках указываем переменную: 1, 2, 3, 4, 5, 6 и т. д. — в зависимости от единиц товара. Соответственно, в таблице мы видим, как в цикле упаковки изменяется счётчик товаров и их состояний. Если любой алгоритм расписывать в виде такой таблички на бумаге, станет понятно, как работает цикл и сам инкремент. Каждый раз, когда мы двигаемся слева направо, номер клеточки увеличивается, а номер клеточки в данном примере и есть переменный инкремент.
Читать также: