%= (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
Практические замечания
- Только целые числа. Оператор
%=не работает с типамиfloatиdouble. Если нужен остаток для чисел с плавающей запятой, используйте функциюfmod()из стандартной математической библиотеки. - Делитель не может быть нулём. Деление на ноль вызовет неопределённое поведение. Если делитель вычисляется динамически, проверяйте его перед использованием оператора.
- Знак результата зависит от знака делимого. Если
xотрицательное, результат тоже будет отрицательным или нулём. Поэтомуx %= 10даёт значение в диапазоне от −9 до 9, а не от 0 до 9, еслиxможет принимать отрицательные значения. - Типичный сценарий — циклический счётчик. Например, если нужно перебирать индексы от 0 до N−1 по кругу,
%=позволяет сделать это одной строкой безif. - Отладка через Serial Monitor. Если результат выглядит неожиданно, выведите значения обоих операндов до и после операции — это поможет быстро понять, не ушло ли делимое в отрицательную область.
Где применяется
- Мигание светодиодов по кругу. Счётчик текущего светодиода увеличивается на 1, а
%=возвращает его в 0 после последнего элемента массива. - Отображение времени. Секунды и минуты удобно ограничивать диапазоном 0–59 с помощью
%= 60. - Равномерное распределение событий. Каждое N-е срабатывание можно определить, проверяя, равен ли остаток нулю.
- Работа с кольцевыми буферами. Индекс записи или чтения автоматически «заворачивается» на начало буфера.
Примечания и предупреждения
- Оператор составного остатка не работает с числами с плавающей запятой.
- Если первый операнд отрицательный, результат отрицательный (или нулевой). Следовательно, результат
x %= 10не всегда будет между 0 и 9, еслиxможет быть отрицательным.