Подтвердить что ты не робот

Почему в то время как условие вне области действия

Чаще всего нам нужны петли вроде этого

do
{
     Type value(GetCurrentValue());
     Process(value);
}while(condition(value));

К сожалению, это не скомпилируется, потому что область value заканчивается на }. Это означает, что мне придется объявить его вне цикла.

Type value;
do
{
    value = GetCurrentValue(); 
    Process(value);
}while(condition(value));

Мне это не нравится по крайней мере по двум причинам. Во-первых, мне нравится декларировать вещи на местном уровне. И, во-вторых, это проблема, если значение не может быть назначаемым или конструктивным по умолчанию, но только для копирования.

Итак, мой вопрос имеет две стороны. Во-первых, я хотел бы знать, была ли какая-то конкретная причина/трудность в расширении do, пока область действия также была до конечного условия (так же как область переменных, объявленных в цикле for, включает тело цикла for, несмотря на то, что оно физически вне брекетов). И если вы считаете, что ответ на мой первый вопрос: "Это так, как есть. Не спрашивайте, почему вопросы". то я хотел бы знать, есть ли идиомы, которые могут помочь написать циклы do-while, похожие на те, что приведены в моем примере, но без упоминавшихся ниже минусов.

Надеюсь, что вопросы понятны.

4b9b3361

Ответ 1

Если вы хотите сохранить value локально область для цикла while, вы можете сделать это вместо этого:

do
{
     Type value(GetCurrentValue());
     Process(value);
     if (! condition(value) )
         break;
} while(true);

Это личное предпочтение, но я нахожу while петли, структурированные следующим образом: while вместо do-while):

while(true) {
    Type value(GetCurrentValue());
    Process(value);
    if (! condition(value) ) {
        break;
    }
}

Правила определения области видимости в C/С++ работают следующим образом: Локальные переменные, объявленные в блоке {...}, являются локальными/видимыми только для этого блока. Например:

int a = 1;
int b = 2; 
{
    int c = 3;
}
std::cout << a;
std::cout << b;
std::cout << c;

будет жаловаться на то, что c не объявлен.

Что касается логики - это просто вопрос согласованности и "то, как определяется язык"