На
сообщение Zorko:
Zorko писал(а):
Я конечно понимаю умом, что согласно стандарту (FOR это WHILE n <= B) так оно и должно быть, но всё же тоже изъянчик!
Он может быть решён, если корректировать значение B до вхождения в цикл (для константных А и B — на этапе компиляции, для неконстантных — в рантайме).
Вот
цикл для общего случая как раз это и делает. До начала цикла вычисляется limit - это и есть "откорректированное В". Причем от
А это значение совсем не зависит, т.е. для корректировки на этапе компиляции достаточно "константности" только
В (
частный случай).
Цитата:
Что, с одной стороны, сделает наши программы чуть надёжнее (не будут зависать при недостаточно точно заданном значении В), с другой, — открывает неограниченные просторы шляповатым программистам-построителям корявых циклов. Эх, хотелось бы увидеть здесь золотую середину.
Насчет "неограниченных просторов" не понял... Имелось в виду "недостаточно точно задать В, надеясь, что компилятор откорректирует"? Это можно неточно задать и сейчас, надеясь что шаг проскочит мимо ненужного. А вот если кто-то использует зацикливание при B=MAX(T) в качестве полезного эффекта в своей программе, то это гораздо худший трюк. Вообще, зацикливание при B=MAX(T) - вот самое плохое и корявое.
Цитата:
Кстати, цикл FOR таки можно сводить к WHILE n <= B, но если ничего не делать с этим переполнением, и B точно не на границе значения типов (B < MAX(T) для step > 0, B > MIN(T) для step < 0).
Не совсем так.
FOR byte := 0 TO 123 BY 8 DO, где byte - знаковый (-128..127), зациклится точно также, хотя B не на границе.