Найти в Дзене
За_тех_кто_в_коде();

Оператор %

% Остаток от ….

Когда я читаю описание данного оператора, мне начинает казаться, что писатели плохо понимают суть его работы. А инструмент весьма удобный и я всё чаще и чаще его использую. Помимо, например, сдвигов содержимого байта. Что, кстати говоря, делает затруднительным, а порой, может быть и даже невозможным, трансляцию Си кода на более высокоуровневые языки, типа питона. Жаль, что тут скажешь.

Чаще всего, данный оператор описывают как «остаток от деления» и приводят классический пример с разбором числа на разряды. Когда фигурирует выражения типа %10 , %100 и так далее. Это безусловно справедливо, и это описывает суть... но лишь частично.

Есть другой вариант, который я встречал. Оно звучит как: «взятие по модулю». Это по-моему совсем какая-то дичь, которую я даже не хочу комментировать. Я не очень понимаю кому данное определение может быть понятным. И не хочу даже пытаться.

Объяснение начнем издалека.

Представим себе микросхему счетчик с пересчетом 16(4 контакта для выхода). То есть мы клацаем, клацаем, проклацали 16, результат сбрасывается на нуль, и далее снова в набор. Мы делаем 3 тыщи клац, 8 тысяч... А счетчик считает до 16, далее начинает опять с нуля. Мы можем считать, что данная микросхема называется счетчик с пересчетом 16.

Представим себе 8 битную переменную, которая в ардуино называется byte. Если мы в бесконечном цикле начнем увеличивать её значение на 1, то после 255 она сбросится на 0. Или если к значению 250 мы прибавим 10, то её значение окажется равным 4 ( нужно учитывать 0). Тут как мне кажется тоже всё понятно. И в ключе данной задачи, мы можем считать, что переменная byte, это счетчик с пересчетом 256.

Теперь мы подходим к оператору %. И описать я его могу как: "счетчик с произвольным пересчетом". Мы напрмер пишем if (!(i % 21)) и условие будет выполняться когда i будет кратным 21. Расчет будет обращаться в 0. А если i будет 22? Значит результатом будет 1.

Чаще всего, данная схема используется для определения является ли кратным переменная какому-то значению, но иногда оператор может использоваться в куда более сложных схемах.

Например как я использую для расчета TIME STAMP

temp = ( value % ((unsigned long) (one_year * years) + (vi_days * one_day))) / one_day;

Это уже к теме, о том что приемы и формулы расчетов в коде, могут весьма сильно отличаться от привычных, классических и в последствии их полностью заменить.

Чем больше пишешь на Си, тем он удобнее становится ;) Как кто-то писал в буржуйском учебнике.