Share via


Одноминутная головоломка - найдите проблему в этом цикле за 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 removed

  • Anonymous
    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, получая процедурку, которая глючит с вероятностью где-то одна четырёхмиллиардная...