kekc_leader писал(а):
Вопрос, собственно, сводится к тому, как работает r.eof.
Например, если мы только-только открыли файл и вызвали Files.Set(r, f, 0), а файл был пустым, будет ли значение r.eof = TRUE или сперва надо вызвать процедуру Files.Read(r, ch), а уж затем смотреть r.eof? Как должно быть?
Должно быть так, чтобы r.eof устанавливалось в TRUE только
после попытки чтения.
Это частный случай принципа, что программа/процедура/etc. должна корректно отрабатывать "нулевой" случай.
Польза от этого такая же, как от нуля в позиционной системе счисления: всё заметно упрощается и упорядочивается.
Это не мешает делать любые оптимизации, потом. Или не делать )))
Полезно назвать это как-нибудь: скажем,
принцип нуля.
Об оптимизации тут речь, потому что в старых книгах, написанных во времена, когда вызов процедуры был дорог (включая виртовские "Алгоритмы ...", которые мне пришлось чистить), программы писали так, чтобы избегать "пустых" процедурных вызовов -- как раз для "нулевых" случаев. Тогда вместо одной проверки внутри рекурсивной процедуры нужно было не забыть поставить проверку-охрану перед любым вызовом -- а иногда эта проверка была не нужна по построению алгоритма, но при изменении про это можно было забыть -- и т.д. -- прямой путь в трясину "отладки".