Сионист писал(а):А вот за это надо посылать в библиотеку с заданием прочитать 5 книг, посвящённых оптимизации: вычитание на каждом шагу.
Если N - это define или константа, то вычитания на каждом шаге не будет, так как это будет соптимизировано на этапе компиляции. Более того, даже если это переменная, всё равно компилятор проведёт оптимизацию. Оптимизации не будет только в том случае, если вместо N будет стоять результат вызова функции. Да и вообще, не в этом была суть поста, а в том, чтобы указать, что были фанатики Паскаля, использующие <= наперекор принятой практике.
Сионист писал(а):Я же имел ввиду вариант, когда индекс границ уже дан в явном виде
Ты правда считаешь, что я пытаюсь тебе доказать, что все циклы нужно писать, используя исключительно "<" ? Ну ты либо наивен, либо троллишь меня. Третьего не дано.
Ещё раз. Мой пример был об обходе обычного массива в направлении роста значения счётчика. Практика использования открытого справа интервала в таких случаях даёт множество удобств. Вот некоторые из них:
- Если идёт полный перебор массива, и N - это количество элементов, то не нужно писать конструкцию N-1 в проверке на выход.
- Если идёт перебор массива кусками друг за другом, то в последующих циклах не нужно корректировать индекс, так как не включённый элемент предыдущего интервала является первым элементом следующего.
- Разность между границами интервала численно равно количеству элементов в этом интервале (снова не нужно коррекция на 1).
Сионист писал(а):Ты писал про N, а это количество.
Ты знаком с математическими обозначениями? Элементы имеют индексы 0, 1, 2, и так далее. Последний имеет какой индекс? N-1. А следующий элемент, который уже не входит в массив, имеет индекс N. Так что N может быть как количеством, так и значением индекса. Эти передёргивания контекста я считаю глупыми вдвойне, так как мы оба понимаем, о чём идёт речь, но ты всё равно продолжаешь спорить, видимо ради самого процесса.
Сионист писал(а):Простейший перебор на адресной арифметике включает границу и в явном виде вычитает единицу
Не обязательно. По подобию с индексным перебором и с итераторами, можно делать перебор не включая правую границу:
Код: Выделить всё
const int N = 10;
int arr[N];
int* begin = arr;
int* end = arr + N;
for (int* cur = begin; cur != end; ++cur)
{
...
}
Как видишь, ни одной коррекции на единицу. В твоём же случае пришлось бы сделать минимум одну коррекцию.
А конец моего предыдущего сообщения ты прочёл? Ты мне можешь сказать в чём смысл спора, который ты сейчас ведёшь или нет?