Одноминутная головоломка - найдите проблему в этом цикле за 60 секунд
??????? ????????? ???? ????????, ? ???? ????????-???????????: ??????? ???????? ? ???? ????? ?? 60 ?????? ??? ??????.
????? ??? ????:
int ar[5];
for (unsigned int i = 4; i >= 0; i--) {
printf("%d\n", ar[i]);
}
????? ?? ???, ????????? ?????? ???? ????????. ???, ?????? ???????
Comments
Anonymous
January 01, 2003
The comment has been removedAnonymous
January 01, 2003
Иван: о, да... :-) :-) :-) Юра: способность быть молодым в душе - это очень большое дело!Anonymous
January 01, 2003
Однако, именно вонинг компилятора (в русско-английском смысле, в смысле вони, которая еще и непрерывная...) скорее всего и послужили причиной этого шедевра. Конечно, я увидел его не именно в таком виде, это я упростил, для наглядности. История, скорее всего, была примерно такова... В далекой далекой галактике какой-то гений написал что-то вроде const unsigned int MaxArraySize = 20; В другой галактике, очень далеко от первой, какой-то другой гений написал: int myArray[MaxArraySize]; Или другой вариант, где-то третий гений написал: #define MAX_ARRAY ... unsigned int MaxArraySize = 0; int myArray[MAX_ARRAY]; В смысле, MAX_ARRAY - это максимум, а MaxArraySize - это текущая длина. Случилось первое или последнее, но в третьей галактике еще кто-то написал вполне логичное: for (int i = MaxArraySize-1; i>=0; i--) ... Но потом, как раз компилятор (после апгрейда на очередную VS) начал истошно вопить про сравнение знакового и беззнакового числа, как будто не мог с этим справиться... Сверху пришла разнарядка срочно эти все вонинги (они же вонючикусы) вычистить. И тут, четвертый гений (скажем, недавно нанятый студент шанхайского университета, которых в моей предыдущей группе Windows Home Server было немало) нашел гениальное решение: for (UINT i = MaxArraySize-1; i>=0; i--) ... И поскольку, код уже много лет был мертвым и ни при каких условиях (ок, ок, почти ни при каких) не выполнялся, то изменение прошло на ура и ничего никто не поймал... Нет, правда, ну если компилятор так хочет беззнаковое число, так ведь надо ему дать! Не правда ли? В общем, к таким вот результатам приводят слишком хорошие компиляторы...Anonymous
May 03, 2008
В последний раз думал над подобной задачкой лет пятьсот назад, поэтому хочу убедиться: фишка в том, что unsigned int всегда будет больше 0?Anonymous
May 03, 2008
This loop just goes on and on :-) Where did you find this code?Anonymous
May 03, 2008
А вообще я еще ни одного языка не встречал, где unsigned можно было бы пользоваться. Вечно какие-то косяки вылазят. То шаблонные конструкции перестают работать. То кастить приходится на каждом шагу. А если не кастить, то оно распространяется по всему модулю, как раковая опухоль. Похожая проблема с const.Anonymous
May 03, 2008
underflow, бесконечный цикл, и указание на непонятную область памяти?Anonymous
May 03, 2008
Он будет крутиться вечно и выводить 128 кб наличной памяти в окресностях стека. Ну, или упадет.Anonymous
May 03, 2008
Однако, компилятор должен бы писать про это ворнинг.Anonymous
May 03, 2008
буквально вчера вычистил такую-же багу - человек использовал арифметические операции над std::string::size_type, что в итоге приводило к попыткам выделения около 4Гб памятиAnonymous
May 03, 2008
не, не смешно, а очень тупо. с интересом читаю аналитику и наблюдения в этом блоге, но остальное такой детсад...Anonymous
May 04, 2008
for (unsigned int i = 4; ~i; i--)Anonymous
May 04, 2008
Куда интереснее, когда молодое дарование во избежание предупреждений компилятора убирает модификатор volatile, получая процедурку, которая глючит с вероятностью где-то одна четырёхмиллиардная...