Перейти к содержимому
Теория · Операторы · урок 1 из 10

Арифметика

Чему вы научитесь

Чему вы научитесь:

  • предсказывать результат деления и остатка для целых чисел, в том числе отрицательных, и замечать переполнение int;
  • менять переменную через ++, -- и += и отличать x++ от ++x;
  • сравнивать значения и соединять условия через &&, || и !;
  • выбирать между double и decimal и не сравнивать дробные числа через ==.
Пять тарелок по три конфеты под доской 17 / 5 и миска с двумя оставшимися конфетами и биркой 17 % 5

C# считает, как калькулятор, но у этого калькулятора свои правила. Главное из них: он помнит тип каждого числа и отвечает числом того же типа.

Представьте, что вы делите 17 конфет между 5 детьми. Резать конфеты нельзя, поэтому каждый получает по 3, а 2 остаются у вас. Деление целых чисел в C# работает так же: дробной части у результата нет, а то, что не поделилось, называется остатком.

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

Давайте разберём, что напечатала программа:

  1. Первые две строки кладут в переменные число конфет и число детей.
  2. Сложение, вычитание и умножение печатают 22, 12 и 85, как на калькуляторе.
  3. sweets / kids печатает 3: столько конфет получит каждый. Оператор / дал частное.
  4. 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, и дробная часть сохранится. Вот два способа:

C#
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. Поэтому знак остатка совпадает со знаком делимого — левого операнда:

C#
Console.WriteLine(-17 / 5); // -3
Console.WriteLine(-17 % 5); // -2
Console.WriteLine(17 % -5); // 2

Давайте проверим каждую строку:

  1. -17 / 5 — это -3: дробь отброшена, и результат сдвинулся к нулю.
  2. -17 % 5 — это -2. Проверьте: -3 * 5 даёт -15, и до -17 не хватает как раз -2.
  3. 17 % -5 — это 2: делимое 17 положительное, поэтому и остаток положительный, хотя делитель отрицательный.

Пройдите программу по шагам и следите за q и r: на каждой проверке они снова собираются в делимое.

ВживуюЧастное и остатокшаг 1 из 13 · рамок: 1

sweets — сколько конфет: 17.

Следите, как q и r снова дают делимое

Этот вопрос часто задают на собеседовании: какой знак у остатка, если делимое отрицательное? В математике остаток обычно считают неотрицательным, а в C# он берёт знак делимого.

Порядок действий

Операторы *, / и % выполняются раньше + и -. Операторы одного уровня выполняются слева направо, а скобки меняют порядок, как в математике:

  • 2 + 3 * 4 равно 14;
  • (2 + 3) * 4 равно 20;
  • 20 / 3 * 2 равно 12: сначала 20 / 3 даёт 6, потом 6 * 2.

Частая ошибка

Среднее двух целых чисел кладут в double в надежде получить дробь:

C#
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 хотя бы один операнд, а не результат.