2012-11-08 12 views
13

Częściej niż nie musimy pętle jak tenDlaczego stan podczas wykonywana poza zrobić, gdy zakres

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

Niestety nie będzie to skompilować, ponieważ zakres value „s kończy się na }. Co oznacza, że ​​będę musiał ją zadeklarować poza pętlą.

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

Nie podoba mi się to z co najmniej dwóch powodów. Po pierwsze lubię deklarować rzeczy lokalnie. Po drugie, jest to problem, jeśli wartość nie jest przypisywalna lub domyślna, a jedynie możliwa do skopiowania.

Moje pytanie ma dwie strony. Po pierwsze, chciałbym wiedzieć, czy istnieje szczególny powód/trudność w rozszerzeniu zakresu działania while do stanu końcowego (tak samo jak zakres zmiennych zadeklarowanych w pętli for zawiera ciało pętli for pomimo fizycznego istnienia poza aparatem). A jeśli uważasz, że odpowiedź na moje pierwsze pytanie brzmi: "Tak po prostu jest, nie pytaj, dlaczego pytania". wtedy chciałbym wiedzieć, czy istnieją idiomy, które mogą pomóc w napisaniu pętli do-while podobnych do tych w moim przykładzie, ale bez wspomnianych wad.

Mam nadzieję, że pytania są jasne.

+3

Zdajesz sobie sprawę, to jest taka sama dla każdego innego rodzaju pętli, prawda? Nie jest to specyficzne do zrobienia/kiedy, więc naprawdę prosisz o zrobienie/pozostanie w szczególnym przypadku. –

+1

Potencjalnie można to wyczyścić, zachowując zakres zmiennej warunkowej, używając zamiast tego pętli 'for'. –

+1

* Częściej niż ** potrzebujemy ** pętli takich jak ta * -> Nie używałem pętli * do-while * w ciągu kilku lat. –

Odpowiedz

9

Jeśli chcesz zachować value lokalnie zawężona do pętli while, można to zrobić w zamian:

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

Jest to tylko osobiste preferencje, ale uważam while pętle skonstruowany jak następuje bardziej czytelne (while zamiast do-while):

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

zasady scoping w C/C++ działa następująco: zmienne lokalne zadeklarowane wewnątrz nawiasów {...} b blokada jest lokalna/widoczna tylko dla tego bloku. Na przykład:

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

będą narzekać c jest nierejestrowanej.

chodzi o uzasadnienie - to tylko kwestia spójności i „to, jak język jest zdefiniowana”

+0

Nie ma nic wspólnego z pytaniem.Pytanie brzmi: "dlaczego", a nie "jak to obejść". –

+0

Nie mogę uwierzyć, że dostałem 2 upvotes ... –

+6

@EdS., John: OP powiedział: "A jeśli uważasz, że odpowiedź na moje pierwsze pytanie brzmi:" Tak właśnie jest, nie pytaj, dlaczego pytania. " ** następnie chciałbym wiedzieć, czy istnieją idiomy, które mogą pomóc w napisaniu pętli do-while podobnych do tych w moim przykładzie, ale bez wspomnianych wad. ** ' – kennytm