Жила была прекрасная переменная икс из клана инт. (читать дальше)Но была у неё неприятная черта характера -- не хотела она выносить присваивания. Ей присваивают, а она показывает дулю (снизу -- окно Watch; жёлтая стрелка -- следующая строка при интерактивной отладке):
Вы скажете, может быть, это не первая итерация цикла? Ладно, попробуем в другом месте:
То же самое. Эти бесконечные зануления икса я поставил только для проверки и только от отчаяния -- ни один из них не срабатывал.
Но на самом деле, она только прикидывалась непокорной. Это была маска. Глубоко внутри она делала то, что от неё просят. Чтобы убедиться в этом, я вывел на экран сообщение со значением:
Что же это за треш? Внутри программа думает, что значение верное, а отладчик считает, что нет...
ОКАЗАЛОСЬ, что до этого в функции был цикл вида for(int x=0;x<6;x++). Как известно, переменная, об'явленная в заголовке такого цикла, имеет область видимости в виде тела этого самого цикла. Снаружи она видна быть не должна. Однако по неизвестной причине она БЫЛА видна снаружи. Если я присваивал ей значение до об'явления нового икса, оно нормально принималось и отображалось в окне. То есть Watch отображал СТАРЫЙ икс. Вот примерный отрывок кода, который отображал изменение икса:
for(int x=0;x<6;x++)
{
//...
}
//Watch: x=6
x=1;//Watch: x=1 (*)
int x;
x=0;//Watch: x=1
Но это ещё не всё. Когда я попытался скомпилировать Release-версию без отладочной информации, она мне сразу же сообщила, что икс в строчке (*) не существует. А компиляция отладочной версии, даже после полной очистки проекта, продолжала прокатывать. Назвал новый икс -- икс1.
Чешу репу. Это баг. IDE: VS2005.