Бесконечный цикл для индекса типа std::size_t

156
30 июня 2019, 05:30

Почему не работает цикл вида:

for (size_t i = str.length(); i>=0; --i) 

Разве тип возвращаемого значения у length не size_t? Почему цикл выдает ошибку?

Answer 1

size_t - тип обычно беззнаковый. А беззнаковое число всегда >=0.

Даже если уменьшить беззнаковый нуль на 1. Что получим? -1? Нет, поскольку - с беззнаковым числом смысла не имеет. Так что получим мы (описанный в стандарте) переход к числу 0xFF..FF, и цикл продолжается...

Кстати, учтите, что для i = str.length() обращение str[i] означает выход за границы диапазона и UB.

Answer 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)
Answer 3

Можно и так:

size_t i = str.length(); 
while(i--) {
   '''
}

Меньше символов, сравнение на равенство с нулем проще, нет преобразований

Answer 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()]. Умышленно ли, по ошибке ли - сказать невозможно.

READ ALSO
DICOM Orthanc. Text Value Attribute(0040,A160)

DICOM Orthanc. Text Value Attribute(0040,A160)

Имеется orthanc-server и проект на C++ с использованием Grassroots DICOMНа сервере имеется запись instance c Text Value Attribute(0040,A160)

134
Задание Кто хочет стать миллионером

Задание Кто хочет стать миллионером

Задали сделать игру Кто хочет стать миллионеромВесь код прописал , сделал вопросы , подсказки

127
Проблема с отрисовкой WinAPI / C++

Проблема с отрисовкой WinAPI / C++

Необходимо создать аналог Марио, желательно не использовать ничего кроме winapi и c++Возникла проблема при отрисовке текстур

100