Почему в то время как условие вне области действия
Чаще всего нам нужны петли вроде этого
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, похожие на те, что приведены в моем примере, но без упоминавшихся ниже минусов.
Надеюсь, что вопросы понятны.
Ответы
Ответ 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
не объявлен.
Что касается логики - это просто вопрос согласованности и "то, как определяется язык"