Инкремент и составное присваивание
Операторы прошлого урока вычисляли новое значение, а переменные при этом не менялись. Часто нужно другое: изменить саму переменную — прибавить очки, списать деньги, посчитать посетителей.
Чтобы прибавить к переменной 5, можно написать score = score + 5. C# сначала вычисляет правую часть со старым значением score, а потом кладёт результат обратно в ту же переменную. Имя приходится писать дважды, а в длинном имени можно опечататься.
У калькулятора для такой задачи есть кнопка «M+». Она прибавляет число с экрана к тому, что уже лежит в памяти, и старое значение не нужно набирать заново. В C# такая кнопка — оператор +=:
int score = 10;
score += 5;
Console.WriteLine(score); // 15
score -= 3;
Console.WriteLine(score); // 12
score *= 2;
Console.WriteLine(score); // 24
score /= 5;
Console.WriteLine(score); // 4
score %= 3;
Console.WriteLine(score); // 1Давайте разберём, как менялась переменная score:
score += 5прибавляет5: было10, стало15.score -= 3вычитает3, и получается12.score *= 2умножает на2, и получается24.score /= 5делит на5. Деление целое, поэтому24 / 5даёт4, а не4.8.score %= 3кладёт вscoreостаток от деления на3, то есть1.
Составное присваивание
Код score += 5 означает то же, что score = score + 5. Такую форму называют составным присваиванием: в ней арифметика и присваивание объединены в один оператор. У каждой арифметической операции есть своя составная форма:
+=прибавляет;-=вычитает;*=умножает;/=делит, а дляintещё и отбрасывает дробную часть;%=оставляет остаток.
Здесь аналогия с калькулятором заканчивается: у калькулятора есть только «M+» и «M−», а в C# так можно записать все пять операций.
Оператор += работает и со строками. После string name = "C"; и name += "#"; в name лежит "C#": + со строкой склеивает текст.
Инкремент и декремент
Прибавлять и вычитать единицу приходится так часто, что для этого есть отдельные операторы. Инкремент visitors++ увеличивает переменную на 1, а декремент visitors-- уменьшает. Это то же, что visitors += 1 и visitors -= 1.
Так работает счётчик посетителей у входа: каждое нажатие на кнопку прибавляет одного человека.
int visitors = 0;
visitors++;
visitors++;
visitors--;
Console.WriteLine(visitors); // 1Два инкремента дают 2, а декремент уменьшает visitors обратно до 1.
Префикс и постфикс
У ++ и -- две формы: после имени (a++) и перед ним (++a). На саму переменную обе формы действуют одинаково: ++ увеличивает её на 1, а -- уменьшает. Разница видна, когда результат операции сразу используют, например присваивают другой переменной:
int a = 5;
int b = a++;
Console.WriteLine(a); // 6
Console.WriteLine(b); // 5
int c = ++a;
Console.WriteLine(a); // 7
Console.WriteLine(c); // 7Постфикс a++
Постфиксная форма запоминает старое значение, увеличивает переменную и отдаёт запомненное. В строке int b = a++; переменная a становится 6, а в b попадает 5.
Префикс ++a
Префиксная форма сначала увеличивает переменную, а потом отдаёт новое значение. В строке int c = ++a; переменная a становится 7, и в c попадает тоже 7.
Если a++; или ++a; стоит отдельной строкой, разницы нет: результат никто не читает, и обе формы только увеличивают a.
Чем i++ отличается от ++i, часто спрашивают на собеседовании. Ответ: обе формы увеличивают переменную на единицу, а различаются значением, которое отдают. Постфикс отдаёт старое значение, префикс — новое.
Частая ошибка
Переменную увеличивают и тут же присваивают ей же результат:
int x = 5;
x = x++; // ✗
Console.WriteLine(x); // 5Компилятор молчит, а x остаётся равным 5. Давайте разберём по шагам:
x++запоминает старое значение5— это его результат.xстановится6.- Присваивание кладёт в
xрезультатx++, то есть5, и увеличение пропадает.
Этот порядок задан правилами C#, поэтому программа всегда печатает 5. Чтобы увеличить x, напишите x++; отдельной строкой, без присваивания.
Главное
score += 5— то же, чтоscore = score + 5; так же работают-=,*=,/=и%=.x++увеличивает переменную на единицу,x--уменьшает.- Постфикс
x++отдаёт старое значение, префикс++x— новое. x = x++не меняетx: пишитеx++;отдельной строкой.