- 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
}
}
absolut 01.03.2012 13:14 # +1
krypt 01.03.2012 13:35 # 0
absolut 01.03.2012 14:12 # +1
krypt 01.03.2012 14:22 # 0
absolut 01.03.2012 14:34 # +3
Сразу отсекаем случай size<0, как невозможный при использовании правильно реализованного контейнера.
Остаются 2 случая: size==0 и size>0.
И вот, при size==0 в варианте Б, переменная i инициализируется нулем, вызывается метод size() и сравнение "<".
В варианте А при size==0, вызывается метод size() и сравнение ">".
Т.е. вся разница в отсутствии инициализации переменной i, о чем я и сказал в первом комментарии.
http://govnokod.ru/9576#comment131647
krypt 01.03.2012 14:42 # 0
absolut 01.03.2012 14:48 # +1
krypt 01.03.2012 14:50 # 0
А вообще у меня с юмором сегодня не очень :)
absolut 01.03.2012 14:51 # 0
krypt 01.03.2012 15:30 # 0
Например, что (int)-1 > (unsigned int)1...
absolut 01.03.2012 15:48 # 0
krypt 01.03.2012 15:51 # 0
krypt 01.03.2012 14:46 # 0
Ладно, ансайнед лонга
gorky 01.03.2012 15:40 # +1
3.14159265 01.03.2012 15:42 # 0
Xom94ok 01.03.2012 13:36 # 0
absolut 01.03.2012 14:11 # 0
Xom94ok 01.03.2012 14:22 # 0
krypt 01.03.2012 14:23 # +2
Xom94ok 01.03.2012 14:34 # 0
roman-kashitsyn 01.03.2012 14:39 # 0
krypt 01.03.2012 14:43 # +2
Xom94ok 01.03.2012 15:20 # 0
absolut 01.03.2012 14:35 # 0
Lure Of Chaos 01.03.2012 22:14 # 0
TheCalligrapher 02.03.2012 00:49 # 0
В любом случае, если 'mHyperlinks' - стандартный контейнер типа 'T', то пользоваться надо было бы 'T::size_type', а не 'size_t'.
А во-вторых, 'if', возможно, был заведен потому, что перед и/или после цикла мог идти еще какой-то условный код. Может его еще не написали или уже выкосили.
Говногость 02.03.2012 01:03 # 0
Если не вспоминать второй абзац, то почему?
TheCalligrapher 02.03.2012 01:26 # +8
Но как только мы устраняем требование непрерывности, гарантировать достаточность типа 'size_t' уже невозможно. В частности в общем случае количество элементов в любом контейнере, который не основан внутренне на массиве, может превышать диапазон типа 'size_t'. Поэтому использовать 'size_t' для представления счетчика элементов или индекса в таких контейнерах - грубая ошибка.
Классический пример: 16-тибитные платформы с сегментированной моделью памяти, где диапазон 'size_t' ограничивался 65535, в то время как количество элементов в списке запросто могло превышать это значение.
Собственно, вопрос тут даже не в том, достаточен ли диапазон 'size_t', а в чисто концептуальной ошибке. Тип 'size_t' предназначен для предсталения размера объекта, а нам нужен тип, предназначенный для подсчета количества отельных объектов. "Размер объекта" и "количество объектов" - это совершенно разные ортогональные концепции. Не надо их путать.
Для массивов между этими концепциями существует паразитная взяимосвязь (ибо массив - сам по себе объект), поэтому для индексации и подсчета массивов 'size_t' еще кое-как применим (хотя и тут кривизна прослеживается). А как только речь заходит о других типов контейнеров, о 'size_t' речи быть не может в приниципе.
Если вам нужен целый беззнаковый тип, который достаточен для подсчета размера любого контейнера в пямяти, то это будет 'uintptr_t', но никак не 'size_t'.
Говногость 02.03.2012 01:55 # 0
absolut 02.03.2012 09:07 # +5
guest 02.03.2012 13:31 # −4
>нужен тип
>других типов
>целый беззнаковый тип
СТАТИКОБЛЯДИ_ВЕСЕЛО_И_ЗАДОРНО_"РЕШАЮТ"_В ЫДУМАННЫЕ_ПРОБЛЕМЫ.ДЖПЕГ
3.14159265 02.03.2012 16:36 # +2
gegMOPO4 03.03.2012 15:53 # 0
Это вряд ли. Такой список просто не помещался бы в адресуемую память.
TheCalligrapher 03.03.2012 23:14 # 0
gegMOPO4 04.03.2012 00:21 # 0
Вот с vector<bool> можно было бы легко получить больше 64К элементов. Или с чем-то вроде deque.
TheCalligrapher 05.03.2012 18:15 # +1
TarasB 02.03.2012 14:18 # 0
if L.Count>0 then
for i := 0 to L.Count-1 do DoSmth(L.Items[i]);
потому что типа если убрать проверку на >0, то цикл всё равно будет выполняться и типа это страшный баг дельфей.
Потом оказалось, что он блять i беззнаковое брал.
Vindicar 03.03.2012 12:38 # +2
Но в лужу я тогда сел знатно, спорить не буду.