Ход исполнения простого кода не соответствует ожидаемому
От: kfmn Россия  
Дата: 02.10.15 09:58
Оценка:
Добрый день, коллеги!

Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!

Есть код
std::vector<SSegmHeader> hdr_arr(hdr_list.begin(), hdr_list.end());
std::vector<SSegmHeader> hdr_arr_phone;
for (size_t i=0; i<hdr_arr.size(); i++)
{
    if (hdr_arr[i].state==0)
        hdr_arr_phone.push_back(hdr_arr[i]);
}


Перед циклом вектор hdr_arr имеет 80 элементов, после цикла новый вектор hdr_arr_phone имеет 28 элементов. Тут все ОК. Мистика начинается дальше.

Если убрать операторные скобки от for'а, т.е. сделать его таким:
for (size_t i=0; i<hdr_arr.size(); i++)
    if (hdr_arr[i].state==0)
        hdr_arr_phone.push_back(hdr_arr[i]);

то цикл (под дебаггером) выполняется только 1 раз, для нулевого элемента вектора условие выполняется, делается push_back и на этом все заканчивается, hdr_arr_phone имеет только 1 скопированный элемент.

Если же добавить к if'у пустой else:
for (size_t i=0; i<hdr_arr.size(); i++)
    if (hdr_arr[i].state==0)
        hdr_arr_phone.push_back(hdr_arr[i]);
    else
    {
    }

то опять все работает, как должно.

Ести еще одна странность: переменная i в этом коде объявляется первый раз по телу функции. Дальше есть другие аналогичные объявления i, но это первое. И все последующие объявления именно такие — в теле цикла.
Тем не менее в неправильно работающем (среднем) варианте после выхода из цикла дебаггер показывает значение i=0 (а не пишет, что она out-of-scope или не определена). Это, конечно, может быть причудой дебаггера, но сам ход исполнения меня приводит в полное недоумение.

Что я делаю не так?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.