#cpp #циклы #for
Почему не работает цикл вида: for (size_t i = str.length(); i>=0; --i) Разве тип возвращаемого значения у length не size_t? Почему цикл выдает ошибку?
Ответы
Ответ 1
size_t - тип обычно беззнаковый. А беззнаковое число всегда >=0. Даже если уменьшить беззнаковый нуль на 1. Что получим? -1? Нет, поскольку - с беззнаковым числом смысла не имеет. Так что получим мы (описанный в стандарте) переход к числу 0xFF..FF, и цикл продолжается... Кстати, учтите, что для i = str.length() обращение str[i] означает выход за границы диапазона и UB.Ответ 2
Условие завершения цикла никогда не выполнится. Цикл не может выдать ошибку. Но он у вас бесконечный, так как число типа size_t не может быть отрицательным, и условие i >= 0 выполняется всегда. Кроме того у вас выход за пределы индекса для str. Варианты исправления: Первый (воспользоваться счётчиком типа int): for (int i = str.length() - 1; i >= 0; --i) Второй (цикл в другую сторону): for (size_t i = 0; i < str.length(); ++i)Ответ 3
Можно и так: size_t i = str.length(); while(i--) { ''' } Меньше символов, сравнение на равенство с нулем проще, нет преобразованийОтвет 4
Корректными идиомами для реализации обратной итерации с беззнаковым индексом, учитывающими природу беззнакового типа, являются for (size_t i = str.length(); i-- > 0; ) { // Работаем с `str[i]` } for (size_t i = str.length(); i > 0; ) { --i; // Работаем с `str[i]` } for (size_t i = str.length() - 1; i != -1; --i) { // Работаем с `str[i]` } Выбирайте, какой вариант вам больше нравится. Стоит также заметить, что все эти варианты работоспособны независимо от знаковости используемого типа. Эти варианты начинают доступ с str[str.length() - 1] и идут вниз до 0. У вас доступ начинается с str[str.length()]. Умышленно ли, по ошибке ли - сказать невозможно.
Комментариев нет:
Отправить комментарий