Здравствуйте, Evgeny.Panasyuk, Вы писали:
N>>Эти "субъективные предрассудки" превращаются в объективные, когда начинаешь смотреть, как воспринимает такой код не только тот, кто всю жизнь "в системе", как я, а и, например, типовой юниор, часто к тому же перешедший с какого-то соседнего языка. EP>Ну давай рассмотрим этот сценарий. Как по-твоему ведёт себя юниор впервые увидевший while(n--)?
Или заплачет и спрячется под стол (реально, будет делать вид, что всё понимает, пока носом не ткнёшь), или разберёт и поймёт логику.
Это всё очевидно. Неочевидно сходу то, насколько скоро он это всё забудет — а если такая идиома встречается не часто, то забудет быстро.
EP>Это пока шаблона while(n--) нет в голове.
С одного раза не запомнится.
EP>Да и что означает closed_range в данном случае? запрет на n=0?
Наоборот, что оба граничных значения включены в набор.
Closed — оба конца включены. Open — оба конца не включены.
Half-open range — например, в C++ для любого контейнера begin() входит в значения, а end() — нет. В Python, аналогично, range(0, 10) это от 0 до 9 включительно (а чтобы от N до M включительно вниз, надо писать range(N, M-1, -1)).
EP>Ну я говорю всё время про while(n--), но можем конечно и вариант с for погрепать. Но суть от этого не меняет — применяется повсеместно.
Вот именно что "повсеместность" этого подхода, как оказывается, сильно однобока.
Разобрать-то я его могу, не вопрос, но если за всё это время не встречал как систематическую идиому — это что-то значит.
EP>Да, сам увидел — я это место дополнил: EP>Точнее one-before-last обходится переносом декремента на первую строчку тела (как уже показывали ранее в этой теме): while(it != first){--it; ...}, но концептуально то же самое.
Ну и снова получаем уже известную проблему: надо перед циклом начать с n+1, чтобы в цикле работать с n. Это уже второй уровень наворота идиомы (первый — формат условия продолжения с пост-декрементом).
N>>Оптимизатор всё равно для типовых случаев вроде плоского массива всё это заоптимизирует. EP>Не всегда варианты простые. Тем не менее — прямее сразу делать оптимально по-возможности жеж.
Так не оптимально же, когда лишний инкремент на входе. Оптимально только если n уже количество элементов с номерами от 0 до n-1. Да, тогда можно пользоваться напрямую. Иначе удобнее через постпроверку.
N>>А через ФВП всё равно получится менее удобно, чем при поддержке foreach самим компилятором. EP>Ну это скорее вопрос к синтаксису замыканий и их возможностей. Радикальное отличие for_each+замыкание от range-based-for — только в return/break/continue, остальное синтаксический сахар.