Он часто используется для лексических сканеров (часть компилятора, которая разбивает ваш текст на куски, такие как имена переменных, константы, операторы и т. Д.). Функция не необходима для сканера, она просто очень удобна.
Когда вы, например, читаете имя переменной, вы не знаете, когда закончите, пока не прочитаете символ, который не может быть частью имени переменной. Но тогда вы должны запомнить этого персонажа и найти способ передать его следующему фрагменту лексера. Вы можете создать глобальную переменную или что-то в этом роде или передать ее вызывающей стороне, но тогда как вы возвращаете другие вещи, например коды ошибок? Вместо этого вы убираете () символ, чтобы поместить его обратно во входной поток, делаете все, что вам нужно, с именем переменной и возвращаете. Затем, когда лексер начинает читать следующий блок, ему не нужно искать лишние символы, лежащие вокруг.