2013-08-30 54 views
9

pisałem coś takiego kodu:Stosować zmienne zadeklarowane wewnątrz zrobić, gdy pętla w stanie

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

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

(http://codepad.org/n5ym7J5w)

i byłem zaskoczony, kiedy mój kompilator powiedział mi, że nie mogę użyć zmienna "j", ponieważ nie została zadeklarowana poza pętlą do-while.

Jestem tylko ciekawy, czy istnieje jakikolwiek techniczny powód, dla którego ten zakaz jest możliwy.

+2

'double' jest słowem kluczowym, i tak,' double' (zmienna) nie znajduje się w zasięgu poza pętlą (dlatego nie może być użyty jako warunek); – Chad

+0

Przepraszamy za używanie podwójnego jako nazwy zmiennej. lol. Zmienione teraz –

+0

zmienna nie może mieć nazwy double, ponieważ jej słowo kluczowe: –

Odpowiedz

2

Jest powód, dla którego nie jest to możliwe. Jest to spowodowane ograniczeniem "zakresu oświadczeń".

Twoje zmienne i oraz j zostały zadeklarowane z "zasięgiem lokalnym" - czyli zmiennymi w nawiasach {}. Właściwie chciałeś, aby j został zadeklarowany z "zasięgiem instrukcji", ale nie jest to możliwe.

Zakres instrukcji to te zmienne zadeklarowane jako część instrukcji "dla", "podczas gdy", "jeśli" lub "przełączania". Zakres instrukcji nie obejmuje jednak instrukcji typu do-while, dlatego nie można tego zrobić.

Wystąpiła w zasadzie niedoskonałość językowa używania do-while.

Byłoby lepiej, gdyby język oferowana:

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

ale nie oferują tego.

12

Zakres j znajduje się wewnątrz aparatów telefonicznych . Nie można go użyć w stanie pętli, który znajduje się poza tym zakresem.

Od projektu standardu C++ mam pod ręką:

Nazwa zadeklarowane w bloku jest lokalny dla tego bloku. Jego potencjalny zasięg rozpoczyna się w momencie deklaracji i kończy się na końcu regionu deklaratywnego.

"Blok" jest również znany jako "złożona instrukcja" i jest zbiorem instrukcji zawartych w nawiasach klamrowych {}.

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

przed każdym zestawem pętli i = 0; i deklarują, że int + dla pętli działa lepiej

+0

Chcesz wyjaśnić? Kod bez objaśnień jest niedopuszczalny w przypadku SO. Proszę również podać wcięcie. -1 – syam

+0

im zły angielski, tylko próbuję pomóc i uzyskać -1 naprawdę ... –

+0

Tak -1 ponieważ nie dostarczyłeś żadnego wyjaśnienia. Nie ma znaczenia, czy twój angielski nie jest bardzo dobry, ale spróbuj przynajmniej. Jak mamy rozumieć, co masz na myśli, jeśli po prostu dajesz kod i nie ma żadnego wyjaśnienia? Wiem, że to wydaje się trudne, ale w ten sposób ulepszamy zarówno SO, jak i siebie. – syam

0

Podwójne, które należy zmienić na niezarezerwowane słowo (dzięki Czad), musi być zadeklarowane poza zakresem instrukcji, aby można było go użyć w stanie while.

int i = 0; 
int d = 0; 
do{ 
    d = i * 2; 
    cout << d; 
    i++; 
} while (d < 100); 
+0

Powinieneś zmienić nazwę "double", jeśli chcesz go _compile_. – Chad

0
  • Składnia pętli wykonaj: {} każda deklaracja zmiennej wewnątrz {} będzie istnieć tylko w tym zakresie. Dlatego zakres j jest tylko w ramach do {}, ponieważ został zadeklarowany w tym zakresie. Można go wywoływać lub odwoływać się tylko w tym zakresie.
  • Jeśli chcesz uzyskać dostęp do j poza tym zakresem, musisz zadeklarować j jako zmienną globalną. Przenieś deklarację j poza ten zakres.