Арифметика
Чему вы научитесь:
- предсказывать результат деления и остатка для целых чисел, в том числе отрицательных, и замечать переполнение
int; - менять переменную через
++,--и+=и отличатьx++от++x; - сравнивать значения и соединять условия через
&&,||и!; - выбирать между
doubleиdecimalи не сравнивать дробные числа через==.

C# считает, как калькулятор, но у этого калькулятора свои правила. Главное из них: он помнит тип каждого числа и отвечает числом того же типа.
Представьте, что вы делите 17 конфет между 5 детьми. Резать конфеты нельзя, поэтому каждый получает по 3, а 2 остаются у вас. Деление целых чисел в C# работает так же: дробной части у результата нет, а то, что не поделилось, называется остатком.
int sweets = 17;
int kids = 5;
Console.WriteLine(sweets + kids); // 22
Console.WriteLine(sweets - kids); // 12
Console.WriteLine(sweets * kids); // 85
Console.WriteLine(sweets / kids); // 3
Console.WriteLine(sweets % kids); // 2Давайте разберём, что напечатала программа:
- Первые две строки кладут в переменные число конфет и число детей.
- Сложение, вычитание и умножение печатают
22,12и85, как на калькуляторе. sweets / kidsпечатает3: столько конфет получит каждый. Оператор/дал частное.sweets % kidsпечатает2: столько конфет осталось у вас. Оператор%дал остаток.
Обычный калькулятор показал бы 3.4, а C# показал 3.
Целое деление
Знаки +, -, *, / и % называют операторами, а числа, с которыми работает оператор, — операндами. Если оба операнда / целые, C# выполняет целое деление: дробная часть результата отбрасывается, а не округляется.
17 / 5равно3, хотя на бумаге получается3.4.19 / 5тоже равно3, хотя3.8ближе к четырём.-17 / 5равно-3, а не-4: у отрицательного результата дробь тоже отбрасывается.
Целое деление всегда сдвигает результат к нулю: положительный — вниз, отрицательный — вверх.
Как получить дробь
Дробный результат получится, если хотя бы один операнд имеет тип double. Тогда C# сам превратит второй операнд в double, и дробная часть сохранится. Вот два способа:
Console.WriteLine(7.0 / 2); // 3.5
Console.WriteLine((double)sweets / kids); // 3.4Как вы помните из темы о типах, дробное число печатается по региональным настройкам компьютера: здесь 3.5, а с русскими настройками — 3,5.
Дробный литерал
Число с точкой, например 7.0, имеет тип double. Литерал 2 рядом с ним превращается в double, и получается 3.5. Этот способ подходит, когда число записано прямо в коде.
Приведение переменной
С переменными нужен другой способ. Код (double)sweets берёт значение sweets и превращает его в double, а сама переменная остаётся int. Сначала C# приводит sweets к double, а потом делит: 17.0 на 5 даёт 3.4.
Остаток
Оператор % даёт остаток от деления. Частное и остаток всегда связаны: a / b * b + a % b равно a. Для конфет это 3 * 5 + 2, то есть снова 17.
Здесь картинка с конфетами заканчивается: отрицательных конфет не бывает, а C# делит и отрицательные числа. Частное сдвигается к нулю, но a / b * b + a % b по-прежнему равно a. Поэтому знак остатка совпадает со знаком делимого — левого операнда:
Console.WriteLine(-17 / 5); // -3
Console.WriteLine(-17 % 5); // -2
Console.WriteLine(17 % -5); // 2Давайте проверим каждую строку:
-17 / 5— это-3: дробь отброшена, и результат сдвинулся к нулю.-17 % 5— это-2. Проверьте:-3 * 5даёт-15, и до-17не хватает как раз-2.17 % -5— это2: делимое17положительное, поэтому и остаток положительный, хотя делитель отрицательный.
Пройдите программу по шагам и следите за q и r: на каждой проверке они снова собираются в делимое.
1int sweets = 17;2int kids = 5;3int q = sweets / kids;4int r = sweets % kids;5Console.WriteLine(q);6Console.WriteLine(r);7Console.WriteLine(q * kids + r);8int n = -17;9q = n / kids;10r = n % kids;11Console.WriteLine(q);12Console.WriteLine(r);13Console.WriteLine(q * kids + r);
sweets — сколько конфет: 17.
Этот вопрос часто задают на собеседовании: какой знак у остатка, если делимое отрицательное? В математике остаток обычно считают неотрицательным, а в C# он берёт знак делимого.
Порядок действий
Операторы *, / и % выполняются раньше + и -. Операторы одного уровня выполняются слева направо, а скобки меняют порядок, как в математике:
2 + 3 * 4равно14;(2 + 3) * 4равно20;20 / 3 * 2равно12: сначала20 / 3даёт6, потом6 * 2.
Частая ошибка
Среднее двух целых чисел кладут в double в надежде получить дробь:
int total = 5;
int count = 2;
double average = total / count; // ✗
Console.WriteLine(average); // 2Компилятор ошибки не видит, и программа печатает 2. Сначала C# выполняет total / count как целое деление, и только его результат 2 превращается в double. Приведите к double операнд, а не результат: (double)total / count даёт 2.5.
Главное
- Деление двух целых отбрасывает дробную часть:
17 / 5— это3, а-17 / 5— это-3. - Оператор
%даёт остаток, и его знак совпадает со знаком делимого. - Частное и остаток связаны:
a / b * b + a % bвсегда равноa. - Чтобы получить дробь, приведите к
doubleхотя бы один операнд, а не результат.