2012-11-08 1 views
13

Чаще всего нам нужны петли, как этотПочему состояние в то время как в вне делать, а объем

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

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

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

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

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

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

+3

Вы понимаете, что это то же самое для любого другого вида петли, верно? Это не относится к do/while, поэтому вы действительно просите, чтобы do/while был особым случаем. –

+1

Вы можете потенциально очистить это, сохранив при этом область переменной условия, используя вместо этого цикл 'for'. –

+1

* Чаще всего мы ** нуждаемся в ** циклах, подобных этому * -> Я не использовал цикл * do-while * в течение нескольких лет. –

ответ

9

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

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/C++ работает следующим образом: Локальные переменные, объявленные в пределах распорной {...} б lock является локальным/видимым только для этого блока. Например:

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

будет жаловаться c время необъявленной.

Что касается обоснования - это просто вопрос последовательности и «это просто, как определяется язык»

+0

Не имеет никакого отношения к вопросу.Вопрос «почему», а не «как обойти это». –

+0

Я не могу поверить, что у этого есть 2 upvotes ... –

+6

@EdS., John: OP сказал: «И если вы считаете, что ответ на мой первый вопрос:« Это так, как есть. Не спрашивайте, почему вопросы. " ** Затем я хотел бы знать, есть ли идиомы, которые могут помочь написать циклы do-while, похожие на те, что приведены в моем примере, но без упоминавшихся ниже минусов. ** ' – kennytm

Смежные вопросы