Re[15]: Откуда эта лютая любовь к знаковым целым?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.05.20 07:57
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

N>>Тут надо было бы пример подправить — reverseFor(i: n..1)

EP>Зачем? Обычно в таких случаях нужны либо индексы, либо просто n итераций — в обоих случаях while(n--) отрабатывает на ура

Случай — он разный бывает. Я показываю, на каком варианте итерации "лаконичность" кода с while(n--) исчезает или превращается в недостаток.

N>>Ну, например, потому что на 1 хоть как-то привычного к такой идиоме будет 10 тех, кто будет смотреть на неё как на новые ворота слишком уж она узкоспецифична.

EP>Запоминается один раз и используются всю жизнь. Повторюсь, встречается повсеместно, рано или поздно всё равно придётся разок посмотреть на эти новые ворота.

Я лет 20 достаточно плотно пишу на C и читаю сишный код, и такую идиому встречал максимум пару раз, а скорее даже реже.

Мой мир — на 98% обычный юниксовый userland, на пару процентов — ядро (Linux, FreeBSD, OpenBSD) — и я не помню, чтобы там кто-то где-то использовал эти заклинания. Возможно, её применяют в каком-то особом подмирке, типа определённого embedded? Расскажите, где это у вас "встречается повсеместно".

EP>Идиома, кстати, применима и к итераторам — у которых может даже и не быть operator<


От замены в аналоге "i-->1" на "i--!=1" теряется только визуальная красота стрелки.

А именно для итераторов в C++ давно придуманы rbegin и rend, которые, как описано, реализуют хак, который надо отрабатывать явным декрементом. То есть для обратного прохода это превратилось бы в такое:

for (unsigned fi = n; fi >= 1; --fi) { // ну или fi != 0, без разницы
  unsigned i = fi - 1; // разрезолвляем обратный итератор в прямой :)
  bar(i);
}


Кстати, это надо добавить в копилку — спасибо за подсказку. Оно опять же не может обеспечить итерацию для UINT_MAX, но это общая проблема всех таких циклов с предусловием.
GCC перевёл в уже привычный вид:

_Z4foo1j:
        test    edi, edi
        je      .L9
        push    rbx
        mov     ebx, edi
.L3:
        sub     ebx, 1
        mov     edi, ebx
        call    _Z3barj@PLT
        test    ebx, ebx
        jne     .L3
        pop     rbx
        ret
.L9:
        rep ret


GCC объединил вообще редакции с fi>=1 и fi!=0 в один код, я не знал, что он такое умеет
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.