Многие новички в сфере разработки не знают, что такое инкремент и декремент, но наверняка уже успели столкнуться с такими участками в коде, как «i++» и «i--». Именно про это сегодня будет идти речь, а также о практических советах и рекомендациях касательно использования таких операций.
Определение и концепция инкремента и декремента
Инкремент – это операция, в результате которой значение переменной увеличивается на единицу. В коде она обозначается как «++», то есть двумя знаками плюса.
Декремент – это операция, в результате которой значение переменной уменьшается на единицу. Обозначение в коде соответствует двум минусам и выглядит как «--».
Инкремент и декремент – это унарные операции. На математическом языке это означает, что у них имеется только один единственный вход и выход, а возвращают они всегда только один результат.
Использование инкремента и декремента в языках программирования
Инкремент и декремент – довольно частые «гости» во многих языках программирования. Широко используются в Java, C, C++, C# и многих других ЯП разного масштаба и назначения. Встречается он даже в машинном языке большей части микропроцессоров. Один из ярких примеров применения таких операций – организация цикла, в котором переменная увеличивается либо уменьшается на единицу с каждым новым циклом. Конечно, это далеко не единственный пример использования.
В некоторых языках программирования, например, в С++, можно инкрементировать не только числа, но и переменные типа bool. Такой формат использования операции встречается редко, но возможен. Однако при попытке декрементирования компилятор выдаст сообщение с ошибкой.
Важно: так как инкремент и декремент являются арифметическими операторами, операнды для их работы обязательно должны принадлежать к числовому типу. Исключение – язык Java. В случае с ним операндами могут быть и данные типа char, так как в этом ЯП они являются подвидом типа int.
Операции инкремента и декремента выполняются в коде очень часто и встречаются практически в любых проектах. В связи с этим арифметическое устройство, предусмотренное в процессоре, имеет возможность выполнять их непосредственно на аппаратном уровне. Для этой задачи используется специальная команда низкого уровня. Именно поэтому инкремент осуществляется сильно быстрее, чем суммирование числа с единицей обычным методом. Конечно, это касается и декремента тоже.
Многие компиляторы кода, написанного на языке программирования C, автоматически заменяют арифметические выражения вида «х = x + 1» и «x +=1» на инкремент, упрощая задачу разработчику.
Какими бывают виды инкремента и декремента
Инкремент и декремент имеют две формы – префиксную и постфиксную. В первом случае плюсы и минусы устанавливаются перед названием переменной, а именно в формате типа «++x» или «--x». Во втором случае обозначения располагаются уже после названия переменной – «x++» либо «x--».
Место расположения плюсов и минусов – не единственная разница между операциями, как можно подумать сначала. В отличие от многих других инструментов разработки, инкремент и декремент не только возвращают значение переменной, но и изменяют его. Принцип меняется в зависимости от того, какая форма операции перед нами – префиксная и постфиксная. Рассмотрим, как именно.
В случае с префиксной нотации сначала переменная сначала изменяется, затем возвращается. Если речь о постфиксной записи, все работает наоборот – сначала возврат значения, а затем изменение. Это правило одинаково действует как на инкремент, так и на декремент. Рассмотрим на примере.
Возьмем код следующего вида:
var x = 6;
Console.WriteLine(++x); // => 7
Console.WriteLine(x); // => 7
Console.WriteLine(x++); // => 7
Console.WriteLine(x); // => 8
Теперь давайте разберемся, что и как в этом коде происходит. Первой строкой задали начальное значение переменной «x». Второй строкой вывели префиксный инкремент «++x». Сначала значение увеличилось на единицу, затем функция вернула увеличенный результат и вывела его на консоль. Третьей строкой мы повторно получили этот результат, т.к. переменная была изменена сначала.
Следующие две строки демонстрируют использование постфиксного инкремента. Сначала вернули значение переменной до увеличения из предыдущего примера. Затем прибавили единицу, снова вывели в консоль результат в виде переменной, которая вполне закономерно увеличилась на один.
Рекомендации по использованию операций инкремента и декремента в коде
Несмотря на то, что инкремент и декремент – это довольно простые в плане понимания и записи операции, многие даже опытные разработчики не совсем правильно используют этот инструмент. Давайте рассмотрим несколько правил, которые помогут в том числе начинающим разработчикам:
- старайтесь использовать операции только в тех случаях, когда нет принципиальной разницы между применением префиксного и постфиксного вариантов;
- не допускайте использование в пределах одного выражения операций и методов, которые не несут побочных эффектов, с методами, у которых такие эффекты есть;
- не используйте одновременно несколько инкрементов и декрементов в одной строке, тем самым выстраивая сложные для восприятия многоуровневые «поезда»;
- в первую очередь при выполнении программы вычисляется тот инкремент или декремент, который находится ближе всего к левой части выражения (подробно об этом ниже);
- нет практического смысла брать инкрементные и декрементные выражения в скобки, так как они никак не влияют на порядок вычисления переменных.
Напоминаем вам, что побочный эффект имеют выражения или функции, результат работы которых сохраняется за пределами срока действий этого выражения или функции.
Помните, что операторы «++» и «--» имеют максимальный приоритет при вычислении результата. При этом не следует путать приоритетность со стандартным порядком, по которому выполняются операторы в языке программирования. Например, в языке Java инструкции выполняются строго в направлении слева направо, и в этом же порядке вычисляются операнды операторов. То же самое касается арифметических операторов кроме преинкремента и предекремента («++x» и «--x»).
Что касается приоритетов, они определяют порядок, в котором исполняются операторы, состоящие в многоуровневой структуре логических или арифметических выражений. То есть, если на одном и тому же уровне встречаются операции, имеющие одинаковый приоритет, порядок их исполнения определяется ассоциативностью. Эту особенность важно учитывать при разработке программы.
Значимость инкремента и декремента для разработчиков
Использование инкремента и декремента в первую очередь делает код более производительным и быстрым. Мы упоминали выше о том, что процессор выполняет такие действия на низком уровне – на это уходит меньше времени и ресурсов. Есть и другие причины использовать такие операции:
- Удобочитаемость кода. Сокращенные выражения по типу «i++» или «--i» выглядит гораздо компактнее и лаконичнее в сравнении с «x = x + 1», при этом не затрудняют понимание кода.
- Ускорение разработки. На первый взгляд различия в скорости разработки проекта не очень явные, но на большой дистанции эффект накапливается и работает в пользу инкремента.
- Вариативность применения. Разработчик может использовать постфиксный и префиксный вариант инкрементирования и декрементирования в зависимости от нужного результата.
Как видите, ничего сложного в операциях «i++» и «i--» нет. Да, при разработке кода вполне можно обойтись и без них, но взяв их на вооружение, вы станете чуть более продвинутым программистом.