#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 #includeint 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 #includeint 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$ Так что, я толком так и не понял, из-за чего весь "сыр-бор".
Комментариев нет:
Отправить комментарий