Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Выход из цикла с unsigned переменной

#cpp #циклы


Нужно обработать все значения от res - 1 до 0 включительно (res имеет тип unsigned
long long)

for (size_t i=res-1;i!=UINT_64;--i) {...}


Компилируется и работает, но выдаёт предупреждение. Можно ли сделать без предупреждений,
не сильно усложняя код (не используя do...while)?
    


Ответы

Ответ 1



for (size_t i = res; i--; ) http://codepad.org/PXPn5CcK #include int main(void) { int a[] = {1,2,3,4,5}; const int n = sizeof a / sizeof (int); for(size_t q = n; q--; ) printf("%d ", a[q]); return 0; }

Ответ 2



Со всей приведенной экзотикой надо и самому извратиться :)... for(size_t i = res-1; i < res; --i) Куда интереснее вопрос, как в цикле прийти ВЕСЬ unsigned диапазон... Тут уже for не спасет, придется i = 0xFFFFFFFF; do { ++i; ..... } while (i < 0xFFFFFFFF);

Ответ 3



for (size_t i = res-1; i != ~size_t(); --i) http://codepad.org/HejYMgZL #include int main(void) { int a[] = {1,2,3,4,5}; const int n = sizeof a / sizeof (int); for(size_t q = n-1; q != ~size_t(); --q) printf("%d ", a[q]); return 0; }

Ответ 4



Так делать не надо (потому что часть данных отбросится), но раз уж очень хочется: size_t i = (size_t)(res-1);

Ответ 5



По крайней мере g++ в 64-bit Ubuntu #include #include #include int main(int ac, char **av) { unsigned long long res = strtoull(av[1] ? av[1] : "0", 0, 10); for (size_t lim = (0UL - 1), i = res - 1; i != lim; i--) printf("%lu\n", i); return 0; } Не ругается. avp@avp-ubu1:hashcode$ g++ -Wall c.c avp@avp-ubu1:hashcode$ ./a.out avp@avp-ubu1:hashcode$ ./a.out 3 2 1 0 avp@avp-ubu1:hashcode$ Так что, я толком так и не понял, из-за чего весь "сыр-бор".

Комментариев нет:

Отправить комментарий