Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>>>Ты всё ещё предпочтёшь воротить нос от стандартной и лаконичной идиомы
TB>>Я такую лаконичность сишную в гробу видал.
TB>>Это говно, а не лаконичность.
TB>>Лаконичность — это reverseFor (i: n-1 .. 0);
EP>Видимо мы как-то по-разному понимаем слово "лаконичность":
EP>EP>reverseFor(i: n-1 .. 0)
EP>vs
EP>while(n--)
EP>
EP>
Тут надо было бы пример подправить — reverseFor(i: n..1) превращается, как минимум, в
i = n + 1; // зачем этот инкремент, когда сразу же идёт вычитание назад?
while(i-->1) {
...
}
с традиционной опасностью получить неожиданный результат, если n было UINT_MAX (да, есть шанс и такой ситуации). (С постпроверкой такой проблемы нет, но это уже другая идиома.)
Кстати, gcc на такой цикл всё равно "обижается" расщеплением и переделкой условия:
При -O2:
_Z3fooj:
lea eax, 1[rdi] ; <-- i = n + 1
cmp eax, 1
jbe .L6 ; <-- фактически, если n<=0, но проверка знаковая
push rbx
mov ebx, edi
.L3:
mov edi, ebx ; <-- по сравнению с предыдущей командой как-то криво выглядит
call _Z3barj@PLT
sub ebx, 1
jne .L3 ; ой, он заменил i-->1 на --i>0. не понравились ему хаки.
pop rbx
ret
.L6:
ret
И только при -Og или -Os логика кода ближе к привычной:
_Z3fooj:
push rbx
inc edi
.L3:
cmp edi, 1
lea ebx, -1[rdi]
jbe .L1
mov edi, ebx
call _Z3barj@PLT
mov edi, ebx
jmp .L3
.L1:
pop rbx
ret
EP>Ну так и замечательно, но вот для обсуждаемого конкретного частного случая while(n--) отлично подходит.
EP>И этот вариант нужно знать, даже если сам не используешь — чтобы моментально парсить сторонний код, где это таки используется. А раз всё равно знаешь — то почему бы не использовать самому?
Ну, например, потому что на 1 хоть как-то привычного к такой идиоме будет 10 тех, кто будет смотреть на неё как на новые ворота
![](/Forum/Images/smile.gif)
слишком уж она узкоспецифична.