2010-03-06 10 views
9

Dlaczego następujące czynności nie powodują błędu?Dlaczego działa ta sama nazwa zmiennej count w zagnieżdżonych pętlach FOR?

for (int i=0; i<10; ++i) // outer loop 
{ 
    for (int i=0; i<10;++i) // inner loop 
    { 
    //...do something 
    } 
//...do something else 
} 

Tak jak ja to rozumiem, zmienne w klamrowych ({...}) są w zakresie tylko w tych szelek. Ale wewnętrzna pętla znajduje się wewnątrz szelek zewnętrznej pętli. Więc jak tylko zadeklaruję int i=0 dla wewnętrznej pętli, czy nie powinienem otrzymać błędu o wielu definicjach?

+0

Jak już zapewne już teraz, dopóki to działa, nie powinieneś tego robić. Może to spowodować mniejszą czytelność i kilka bardzo nieprzyjemnych błędów. – helpermethod

Odpowiedz

14

W rzeczywistości tworzysz nową zmienną o tej samej nazwie co inna zmienna. Ponieważ są one w różnych zakresach, jest to dozwolone, a zmienna w wewnętrznym zasięgu "jest właścicielem" nazwy. Nie będziesz mieć dostępu do zewnętrznego zakresu i w wewnętrznym zasięgu.

Sama deklaracja pętli for jest częścią zakresu pętli for, więc liczy się jako część zakresu wewnętrznego w przypadku drugiego i.

+0

Poręczny link z C++ przykłady różnych zakresów: http://h30097.www3.hp.com/docs//base_doc/DOCUMENTATION/V40F_HTML/AQTLTBTE/DOCU_016.HTM –

+0

@Justin nie ma sposobu na dostęp do zewnętrznej pętli. ? –

+0

Nie. Wystarczy nazwać wewnętrzną pętlę 'i' coś innego. Często można zobaczyć zagnieżdżone zmienne indeksów pętli jako progresywne znaki alfabetu zaczynające się od 'i',' j', 'k', itd. –

2

Najlepszym sposobem, aby zrozumieć to, aby myśleć o wszystko pomiędzy (i) gdy zadeklarujesz dla pętli jako wewnątrz szelki tej pętli, przynajmniej w tym dotyczy zakresu.

Aby to zrozumieć, rozważ funkcję, w której nie zadeklarowano żadnej zmiennej x, a następnie poniższy kod spowoduje błąd. (We również przy założeniu, że nie ma drugiej zmiennej x określono w skali globalnej.)

for (int x = 0; x < 10; x++) 
{ 
    something(); 
} 
x++; // error, x is not defined. 
2

C++ kompilator uznaje to za ważne, ponieważ zakres sekundę tylko w {} szelki. Jeśli zaimplementujesz to samo w C, zobaczysz błąd podobny do tego:

$ gcc test.c 
test.c: In function ‘main’: 
test.c:10: error: ‘for’ loop initial declaration used outside C99 mode 
test.c:12: error: ‘for’ loop initial declaration used outside C99 mode 

Jest to niezgodne z prawem w większości dialektów języka C; to jest deklaracja C prawnego ++, a więc mogą być przyjęte, jeśli są kompilacji C z C++:

for(int i=0; i<5; ++i){} 

powszechne jest mieć iterację pętli tylko w zakresie pętli w C++, ale C sprawia, z pewnością (zwłaszcza z C90, a nie C99), że deklaracja wykracza poza zakres pętli. Nadzieja, która pomaga ... :-)

Tak więc, po zadeklarowaniu kolejnej pętli FOR w starszej wersji, zakres zaczyna się od nowa, a Twój kod kompiluje się bez błędów w C++ lub C99. Jest to zwykle przyjęta norma dla deklaracji zakresu.

+0

Jest to ta sama koncepcja, nawet jeśli używa się tej samej zmiennej w tym samym zakresie - Np .: 'for (int i = 0; i <10; i ++) {// some code} for (int i = 0; i <10; i ++) {// inny kod} 'Jest poprawny w C++, ale jest nieprawidłowy w większości dialektów C. – reubenjohn

0

CZY MASZ SIĘ, ŻE NIE ZOSTANIE BŁĄD PODCZAS WYKONYWANIA ...?

Próbujesz zdefiniować dwie zmienne typu int w obrębie tej samej granicy. Do tego spowoduje to wygenerowanie błędu.w C# jeśli u wypróbować ten sam kod dostaniesz błąd

Błąd 1 lokalna zmienna o nazwie „Ja” nie może być uznana w tym zakresie, ponieważ dałoby to inny sens „i”, który jest już używane w "macierzystym lub bieżącym" zakresie oznaczania czegoś innego

+1

TAK, JESTEM PEWNY ....! Nie, że rozumiem problem lepiej, myślę, że zachowanie C++ jest poprawne. –

Powiązane problemy