Здравствуйте, 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 в один код, я не знал, что он такое умеет