9 дек. 2010 г.

Инициализация цикла из середины

Увидел у Маконелла интересную конструкцию. Иногда нужно перед входом в цикл произвести какие-то действия, а потом повторять их в этом цикле, который завершгится при определенном результате выполнения этих действий. Например:
  
fread(hFile, buffer, buffSize, &readedSize);
while ( readedSize > 0 )
{
foo();
fread(hFile, buffer, buffSize, &readedSize);
}


Получается не очень красиво, т.к. в случае изменения первого fread можно забыть про необходимость тех же изменений во втором.

Но можно сделать так:
  
goto readBuffLabel;
while ( readedSize > 0 )
{
foo();
readBuffLabel:
fread(hFile, buffer, buffSize, &readedSize);
}


В этом случае мы имеем безусловный переход на строку, которая в единственном экземпляре произведет чтение из файла и в случае 0 размера прочитанных данных цикл завершится без выполнения foo().

Комментариев нет:

Отправить комментарий