- 1
- 2
- 3
- 4
- 5
- 6
- 7
if(mHyperlinks.size()>0)
{
for(size_t i=0;i<mHyperlinks.size();i++)
{
//some code
}
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+1006
if(mHyperlinks.size()>0)
{
for(size_t i=0;i<mHyperlinks.size();i++)
{
//some code
}
}
Сразу отсекаем случай size<0, как невозможный при использовании правильно реализованного контейнера.
Остаются 2 случая: size==0 и size>0.
И вот, при size==0 в варианте Б, переменная i инициализируется нулем, вызывается метод size() и сравнение "<".
В варианте А при size==0, вызывается метод size() и сравнение ">".
Т.е. вся разница в отсутствии инициализации переменной i, о чем я и сказал в первом комментарии.
http://govnokod.ru/9576#comment131647
А вообще у меня с юмором сегодня не очень :)
Например, что (int)-1 > (unsigned int)1...
Ладно, ансайнед лонга
В любом случае, если 'mHyperlinks' - стандартный контейнер типа 'T', то пользоваться надо было бы 'T::size_type', а не 'size_t'.
А во-вторых, 'if', возможно, был заведен потому, что перед и/или после цикла мог идти еще какой-то условный код. Может его еще не написали или уже выкосили.
Если не вспоминать второй абзац, то почему?
Но как только мы устраняем требование непрерывности, гарантировать достаточность типа 'size_t' уже невозможно. В частности в общем случае количество элементов в любом контейнере, который не основан внутренне на массиве, может превышать диапазон типа 'size_t'. Поэтому использовать 'size_t' для представления счетчика элементов или индекса в таких контейнерах - грубая ошибка.
Классический пример: 16-тибитные платформы с сегментированной моделью памяти, где диапазон 'size_t' ограничивался 65535, в то время как количество элементов в списке запросто могло превышать это значение.
Собственно, вопрос тут даже не в том, достаточен ли диапазон 'size_t', а в чисто концептуальной ошибке. Тип 'size_t' предназначен для предсталения размера объекта, а нам нужен тип, предназначенный для подсчета количества отельных объектов. "Размер объекта" и "количество объектов" - это совершенно разные ортогональные концепции. Не надо их путать.
Для массивов между этими концепциями существует паразитная взяимосвязь (ибо массив - сам по себе объект), поэтому для индексации и подсчета массивов 'size_t' еще кое-как применим (хотя и тут кривизна прослеживается). А как только речь заходит о других типов контейнеров, о 'size_t' речи быть не может в приниципе.
Если вам нужен целый беззнаковый тип, который достаточен для подсчета размера любого контейнера в пямяти, то это будет 'uintptr_t', но никак не 'size_t'.
>нужен тип
>других типов
>целый беззнаковый тип
СТАТИКОБЛЯДИ_ВЕСЕЛО_И_ЗАДОРНО_"РЕШАЮТ"_В ЫДУМАННЫЕ_ПРОБЛЕМЫ.ДЖПЕГ
Это вряд ли. Такой список просто не помещался бы в адресуемую память.
Вот с vector<bool> можно было бы легко получить больше 64К элементов. Или с чем-то вроде deque.
if L.Count>0 then
for i := 0 to L.Count-1 do DoSmth(L.Items[i]);
потому что типа если убрать проверку на >0, то цикл всё равно будет выполняться и типа это страшный баг дельфей.
Потом оказалось, что он блять i беззнаковое брал.
Но в лужу я тогда сел знатно, спорить не буду.