K & R тетрадь упражнение 1.21

Вот вопрос:

Напишите программу entab, которая заменяет строки пробелов минимальным количеством вкладок и пробелов для достижения одинакового расстояния. Используйте те же табуляции, что и для detab. Когда для достижения позиции табуляции будет достаточно вкладки или одного пробела, какой из них следует отдать предпочтение?

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

#include <stdio.h>
#define TABINC 8

main()
{
int c, nb, nt, pos;

nb = 0;
nt = 0;
for (pos = 1; (c =getchar()) != EOF; ++pos)
    if (c == ' '){
        if (pos % TABINC != 0)
            ++nb;
        else {
            nb = 0;
            ++nt;
        }
    }
    else {
        for ( ; nt > 0; --nt)
            putchar('\t');
        if (c == '\t')
            nb = 0;
        else
            for ( ; nb > 0; --nb)
                putchar(' ');
        putchar(c);
        if ( c == '\n')
            pos = 0;
        else if (c == '\t')
            pos = pos + (TABINC - (pos - 1) % TABINC) - 1;
    }
}

Часть, которую я не понимаю, следующая:

else if (c == '\t')
    pos = pos + (TABINC - (pos - 1) % TABINC) - 1;

Через отладку в Visual Studio я вижу, что эта конструкция переносит позицию к следующей остановке вкладки, когда вкладка происходит из входного потока. Это верно?

Что я действительно не понимаю, так это то, как работает эта формула или как они ее придумали. это общая формула, которая встречается в программировании? Это полезно? У него есть имя?

Изменить: я понимаю, что делает оператор по модулю. Извините, я не уточнил это.

Ответы на вопрос(2)

Ваш ответ на вопрос