Digs - Персональная территория

Авторский проект Артема Глазкова
? 
        Версия для печати (цвет)  

Использование материалов
Заметка #27
18 ноября 2007

Continue


    Delphi 2007. В других не проверял.

    Пишем простой кусок кода (располагается внутри цикла):

if condition then
  begin
    ...
    continue;
  end
else A := 15;
ShowMessage(IntToStr(A));

    Вроде бы все законно, но при компиляции на последней строке выдается предупреждение "Variable 'A' might not have been initialize". Навряд ли это диктуется какими-то стандартами. Понятно, что в данном случае можно было избавиться от else, так как при срабатывании if строка A := 15; выполняться не будет. Но это если случай простой.
    Пойдем дальше. Создадим внутри begin...end еще одно условие:

if condition then
  begin
    ...
    if conditon2 then continue
    else A := 14;
  end
else A := 15;
ShowMessage(IntToStr(A));

    От внешнего else теперь избавляться нельзя по вполне понятным причинам. Внутреннее условие подобие внешнего, поэтому получаем тот же самый Warning. Пока все "нормально" :).
    Теперь избавляемся от внутреннего else:

    if conditon2 then continue;
    A := 14;

    ...и получаем тот же самый Warning. Если до этого все можно было списать на глюк, то теперь вообще ничего не понятно. Единственный вариант, это поменять строчки местами:

    A := 14;
    if conditon2 then continue;

    Да, предупреждение исчезает, но получаем неоправданный код присвоения. Особенно, если при этом будет происходить много вычислений. Здесь видимо уже придется танцевать с бубном.
    Можно конечно делать фиктивное присвоение простого значения до условия, а требуемое после строки с continue. По идее, если учитывать описанную выше логику для continue, это должно нормально восприниматься компилятором. Но здесь, как ни странно, обработка кода ведется правильным образом. Т.е. на присвоение до continue получаем hint, что значение переменной присваивается, но потом нигде не используется.
    В конструкции case также наблюдается глюк:

case value of
  value1 : A := 15;
else continue;
end;
    
    После конструкции case при использовании переменной получаем тот же самый Warning.
    Для тех, кто захочет экспериментировать, напомню, что переменные типа string инициализируются на слове begin в начале функции/процедуры пустым значением, поэтому с ними такой трюк не проходит.


© 2005-16, Powered By Digs (Написать письмо, vk)