Главная chevron_right Структура chevron_right Составные операторы chevron_right %= (compound remainder)

%= (compound remainder)

Оператор %= делит переменную на делитель и записывает остаток обратно в неё — удобно для циклических счётчиков и кольцевых буферов. Работает с целочисленными типами.

Полная статья

Описание

Оператор %= — это сокращённая запись операции «взять остаток от деления и сохранить результат». Вместо того чтобы писать x = x % divisor, можно написать короче:

x %= divisor; // equivalent to the expression x = x % divisor;

По смыслу это полностью эквивалентно развёрнутой форме: результат деления x на divisor с остатком записывается обратно в x.

Оператор удобен там, где нужно «закольцевать» значение переменной — например, чтобы счётчик сбрасывался в ноль, достигнув определённой границы.

Синтаксис

x %= divisor; // equivalent to the expression x = x % divisor;

Параметры

  • x — переменная, над которой выполняется операция. Допустимые типы данных: int.
  • divisor — делитель; не должен быть равен нулю. Допустимые типы данных: int.

Пример кода

    int x = 7;
    x %= 5;    // x теперь равен 2

Практические замечания

  1. Только целые числа. Оператор %= не работает с типами float и double. Если нужен остаток для чисел с плавающей запятой, используйте функцию fmod() из стандартной математической библиотеки.
  2. Делитель не может быть нулём. Деление на ноль вызовет неопределённое поведение. Если делитель вычисляется динамически, проверяйте его перед использованием оператора.
  3. Знак результата зависит от знака делимого. Если x отрицательное, результат тоже будет отрицательным или нулём. Поэтому x %= 10 даёт значение в диапазоне от −9 до 9, а не от 0 до 9, если x может принимать отрицательные значения.
  4. Типичный сценарий — циклический счётчик. Например, если нужно перебирать индексы от 0 до N−1 по кругу, %= позволяет сделать это одной строкой без if.
  5. Отладка через Serial Monitor. Если результат выглядит неожиданно, выведите значения обоих операндов до и после операции — это поможет быстро понять, не ушло ли делимое в отрицательную область.

Где применяется

  • Мигание светодиодов по кругу. Счётчик текущего светодиода увеличивается на 1, а %= возвращает его в 0 после последнего элемента массива.
  • Отображение времени. Секунды и минуты удобно ограничивать диапазоном 0–59 с помощью %= 60.
  • Равномерное распределение событий. Каждое N-е срабатывание можно определить, проверяя, равен ли остаток нулю.
  • Работа с кольцевыми буферами. Индекс записи или чтения автоматически «заворачивается» на начало буфера.

Примечания и предупреждения

  1. Оператор составного остатка не работает с числами с плавающей запятой.
  2. Если первый операнд отрицательный, результат отрицательный (или нулевой). Следовательно, результат x %= 10 не всегда будет между 0 и 9, если x может быть отрицательным.

Полезные материалы