Re[19]: Откуда эта лютая любовь к знаковым целым?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.05.20 12:54
Оценка:
Здравствуйте, 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, остальное синтаксический сахар.

Угу.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.