Главная chevron_right Структура chevron_right Арифметические операторы chevron_right % (remainder)

% (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; // оператор остатка сбрасывает переменную по кругу
    }

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

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

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

  • Анимация светодиодной ленты по кругу: индекс активного светодиода увеличивается на 1 и берётся по модулю длины ленты — переход от последнего к первому происходит автоматически.
  • Кольцевой буфер: при записи данных с датчика в массив фиксированного размера оператор % позволяет указатель записи «перематывать» на начало, не выходя за границы.
  • Вывод данных через заданный интервал итераций: например, if (loopCount % 100 == 0) Serial.println(value); печатает значение каждые 100 проходов loop() без использования таймеров.
  • Разбивка числа на цифры: последовательное применение % 10 и деления на 10 позволяет извлекать цифры числа по одной для вывода на дисплей.

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