Re[13]: Откуда эта лютая любовь к знаковым целым?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.05.20 06:31
Оценка:
Здравствуйте, 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 тех, кто будет смотреть на неё как на новые ворота слишком уж она узкоспецифична.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.