Используйте переменные, объявленные внутри цикла do-while в условии

Я писал что-то вроде этого кода:

do {
    int i = 0;
    int j = i * 2;
    cout<<j;

    i++;
} while (j < 100);

(http://codepad.org/n5ym7J5w)

и я был удивлен, когда мой компилятор сказал мне, что я не могу использовать переменную 'j', потому что она не объявлена ​​вне цикла do-while.

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


person José D.    schedule 30.08.2013    source источник
comment
double — это ключевое слово, и да, double (переменная) не находится вне цикла (поэтому его нельзя использовать в качестве условия);   -  person Chad    schedule 31.08.2013
comment
Извините за использование double в качестве имени переменной. ржунимагу. Сейчас отредактировано   -  person José D.    schedule 31.08.2013
comment
переменная не может иметь двойное имя, потому что ее ключевое слово   -  person Michał Szałapski    schedule 31.08.2013
comment
Вы по-прежнему получаете ту же ошибку компиляции после переименования double в j? Также, пожалуйста, опубликуйте ошибку дословно.   -  person frsfnrrg    schedule 31.08.2013
comment
Этот код почти эквивалентен for(;;) {cout << 0;}   -  person chris    schedule 31.08.2013
comment
@chris Да, если он вообще скомпилирован (проблема области j).   -  person syam    schedule 31.08.2013
comment
@syam, Да, просто исправляя это, ты получаешь мой код.   -  person chris    schedule 31.08.2013
comment
Техническая причина в том, что абсолютно бессмысленно использовать переменную в состоянии, которое вы собираетесь сбрасывать и повторно инициализировать каждый раз, когда входите в цикл.   -  person Crowman    schedule 31.08.2013


Ответы (5)


Есть причина, по которой это невозможно. Это связано с ограничением «области действия оператора».

Ваши переменные i и j были объявлены с "локальной областью видимости" - то есть переменными внутри скобок {}. На самом деле вы хотели, чтобы j был объявлен с «областью оператора», но это невозможно.

Область действия операторов — это переменные, объявленные как часть операторов for, while, if или switch. Однако область действия оператора не распространяется на операторы do-while, поэтому вы не можете этого сделать.

Вы в основном выявили языковой недостаток использования do-while.

Лучше бы язык предлагал:

do {
.
.
.
} while (int j < 100);

а этого не предлагает.

person Faisal Memon    schedule 30.08.2013

Область действия j находится внутри фигурных скобок {}. Вы не можете использовать его в условии цикла, которое находится за пределами этой области.

Из чернового стандарта С++ у меня есть удобный:

Имя, объявленное в блоке, является локальным для этого блока. Его потенциальная область действия начинается в точке его объявления и заканчивается в конце его декларативной области.

«Блок» также известен как «составной оператор» и представляет собой набор операторов, заключенных в фигурные скобки {}.

person Carl Norum    schedule 30.08.2013

Double, который должен быть заменен незарезервированным словом (спасибо Чаду), должен быть объявлен вне области видимости do, чтобы его можно было использовать в условии while.

int i = 0;
int d = 0;
do{
    d = i * 2;
    cout << d;
    i++;
} while (d < 100);
person user2680198    schedule 30.08.2013
comment
Вы должны изменить имя double, если хотите, чтобы он скомпилировался. - person Chad; 31.08.2013

  • Синтаксис цикла do: do{ } любое объявление переменной внутри { } будет существовать только в пределах этой области. Следовательно, область j находится только внутри do{ }, потому что она была объявлена ​​в этой области. Его можно вызывать или ссылаться только в пределах этой области.
  • Если вы хотите получить доступ к j за пределами этой области, вам нужно объявить j как глобальную переменную. Переместите объявление j за пределы этой области.
person Juniar    schedule 30.08.2013

int j = 0;
for(int i = 0;j < 100;++i){
j = i * 2;
cout<<j;
}

перед каждым циклом установите i = 0; и объявить как int + for loop работает лучше

person Michał Szałapski    schedule 30.08.2013
comment
Хочешь объяснить? Код без пояснений не принимается на SO. Также, пожалуйста, сделайте отступ. -1 - person syam; 31.08.2013
comment
у меня плохой английский, просто я пытаюсь помочь и получаю -1 на самом деле... - person Michał Szałapski; 31.08.2013
comment
Да -1, потому что вы не предоставили никаких объяснений. Неважно, если ваш английский не очень хорош, но, пожалуйста, попробуйте хотя бы. Как мы должны понять, что вы имеете в виду, если вы просто даете код и вообще никаких объяснений? Я знаю, это кажется суровым, но именно так мы продолжаем улучшать как SO, так и самих себя. - person syam; 31.08.2013
comment
Нет проблем, просто помните, что я голосовал не против вас, а только против этого сообщения. Я удалил его, потому что вы пытались. ;) - person syam; 31.08.2013