% (remainder)
Оператор % возвращает остаток от целочисленного деления — удобен для циклического обхода массивов, проверки чётности и периодических действий в loop().
Полная статья
Описание
Оператор % (процент) вычисляет остаток от деления одного целого числа на другое. Это целочисленная операция: дробная часть результата просто отбрасывается, и вы получаете только то, что «не поместилось» в делитель.
Одна из самых частых задач, где пригождается %, — удерживать счётчик в определённом диапазоне. Например, если нужно перебирать индексы массива по кругу, выражение i = (i + 1) % arraySize автоматически «перематывает» i обратно к нулю, когда тот достигает конца массива.
% — символ, которым оператор записывается в коде.
Синтаксис
remainder = dividend % divisor;
Параметры
remainder: переменная, в которую записывается результат. Допустимые типы данных:int,float,double.dividend: делимое — переменная или константа. Допустимые типы данных:int.divisor: делитель — переменная или константа, не равная нулю. Допустимые типы данных:int.
Пример кода
int x = 0;
x = 7 % 5; // x теперь равно 2
x = 9 % 5; // x теперь равно 4
x = 5 % 5; // x теперь равно 0
x = 4 % 5; // x теперь равно 4
x = -4 % 5; // x теперь равно -4
x = 4 % -5; // x теперь равно 4
/* обновлять одно значение в массиве при каждом проходе цикла */
int values[10];
int i = 0;
void setup() {}
void loop() {
values[i] = analogRead(0);
i = (i + 1) % 10; // оператор остатка сбрасывает переменную по кругу
}
Практические замечания
- Только целые числа. Оператор
%не работает с типамиfloatиdouble. Если попытаться применить его к числу с плавающей запятой, компилятор выдаст ошибку. - Делитель не может быть нулём. Деление на ноль приводит к неопределённому поведению. Если делитель вычисляется в рантайме, проверяйте его перед использованием.
- Знак результата совпадает со знаком делимого. Если первый операнд отрицательный, остаток тоже будет отрицательным или нулевым. Поэтому выражение
x % 10даст значение в диапазоне от −9 до 9, а не от 0 до 9, еслиxможет быть отрицательным. Учитывайте это при работе с датчиками или вычислениями, где знак не фиксирован. - Циклический обход массива. Классический приём —
index = (index + 1) % arrayLength. Это безопаснее, чем вручную сбрасывать счётчик черезif. - Проверка чётности. Выражение
x % 2 == 0— стандартный способ определить, чётное ли числоx.
Где применяется
- Анимация светодиодной ленты по кругу: индекс активного светодиода увеличивается на 1 и берётся по модулю длины ленты — переход от последнего к первому происходит автоматически.
- Кольцевой буфер: при записи данных с датчика в массив фиксированного размера оператор
%позволяет указатель записи «перематывать» на начало, не выходя за границы. - Вывод данных через заданный интервал итераций: например,
if (loopCount % 100 == 0) Serial.println(value);печатает значение каждые 100 проходовloop()без использования таймеров. - Разбивка числа на цифры: последовательное применение
% 10и деления на 10 позволяет извлекать цифры числа по одной для вывода на дисплей.