Какова цель ungetc (или ungetch от K&R)?

HOUR(FROM_UNIXTIME(1547654400000/1000)) -> 8

  1. Разделите на 1000, чтобы получить от миллисекунд до «unixtime».
  2. Преобразовать в формат времени.
  3. Извлеките ту часть, которая вам нужна. (Это может быть сделано с помощью MID() или других манипуляций со строками.)

Предупреждение. Это позволит получить «час», связанный с любым часовым поясом, запеченным в значении.

Возможно, это то, что вы хотели:

FLOOR(1547654400000/(1000*3600))%24, с другой стороны, дает вам 16 «час», который находится в значении.

Подумайте об этом следующим образом: разделите на части ниже «часа» (миллисекунды и секунды в час), затем перейдите по модулю количества часов в день (24).

10
задан Deduplicator 23 January 2015 в 11:17
поделиться

3 ответа

Я не знаю об определенном примере, который Вы отсылаете к (Это - проребенок 23 года, с тех пор как я считал K&R, и это было первым выпуском.), но часто при парсинге удобно 'посмотреть' на следующий символ, чтобы видеть, является ли это часть того, что Вы в настоящее время анализируете. Например, при чтении числа, Вы хотите продолжать читать цифры, пока Вы не приезжаете в нецифру. Ungetc позволяет читателю числа посмотреть на следующий символ, не используя его так, чтобы кто-то еще мог считать его. В примере Greg Hewgill "2 3 +", читатель числа считал бы 3 цифры, затем читают знак "плюс" и знают, что число закончено, затем ungetc знак "плюс" так, чтобы это могло быть считано позже.

27
ответ дан 3 December 2019 в 13:56
поделиться

Попытайтесь запустить программу без пробелов вокруг операторов. Я не вспоминаю точно формат того примера, и я не имею K&R удобный, но вместо того, чтобы использовать "2 3 +" попытка "2 3 +". ungetch() вероятно, используется при парсинге чисел, поскольку синтаксический анализатор числа считает цифры, пока это не получит что-то, что является нецифрой. Если нецифра является пространством, то следующее getch() будет читать + и все хорошо. Однако, если следующая нецифра является a +, затем это должно будет продвинуть ту спину на входной поток, таким образом, основной цикл чтения сможет найти его снова.

Надежда я помню пример правильно.

10
ответ дан 3 December 2019 в 13:56
поделиться

Это использовало много для лексических анализаторов (часть компилятора, который повреждает Ваш текст в блоки как имена переменной, константы, операторы, и т.д.). Функция не необходима для сканера, это просто очень удобно.

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

4
ответ дан 3 December 2019 в 13:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: