Почему не работает цикл вида:
for (size_t i = str.length(); i>=0; --i)
Разве тип возвращаемого значения у length не size_t? Почему цикл выдает ошибку?
size_t
- тип обычно беззнаковый. А беззнаковое число всегда >=0
.
Даже если уменьшить беззнаковый нуль на 1. Что получим? -1
? Нет, поскольку -
с беззнаковым числом смысла не имеет. Так что получим мы (описанный в стандарте) переход к числу 0xFF..FF
, и цикл продолжается...
Кстати, учтите, что для i = str.length()
обращение str[i]
означает выход за границы диапазона и UB.
Цикл не может выдать ошибку. Но он у вас бесконечный, так как число типа size_t
не может быть отрицательным, и условие i >= 0
выполняется всегда. Кроме того у вас выход за пределы индекса для str
.
Варианты исправления:
Первый (воспользоваться счётчиком типа int
):
for (int i = str.length() - 1; i >= 0; --i)
Второй (цикл в другую сторону):
for (size_t i = 0; i < str.length(); ++i)
Можно и так:
size_t i = str.length();
while(i--) {
'''
}
Меньше символов, сравнение на равенство с нулем проще, нет преобразований
Корректными идиомами для реализации обратной итерации с беззнаковым индексом, учитывающими природу беззнакового типа, являются
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()]
. Умышленно ли, по ошибке ли - сказать невозможно.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Имеется orthanc-server и проект на C++ с использованием Grassroots DICOMНа сервере имеется запись instance c Text Value Attribute(0040,A160)
Задали сделать игру Кто хочет стать миллионеромВесь код прописал , сделал вопросы , подсказки
Необходимо создать аналог Марио, желательно не использовать ничего кроме winapi и c++Возникла проблема при отрисовке текстур