2011-09-30 10 views
9

Przepraszam za to zbyt proste pytanie, ale nie wydaje się, aby dowiedzieć się tego przykładu w książce Czytam:Czy ktoś może wyjaśnić ten fragment (dlaczego są tutaj te szelki)?

void f5() 
{ 
    int x; 
    { 
     int y; 
    } 
} 

Jakie są szelki dla okolicznych int y? Czy możesz umieścić aparaty ortodontyczne w dowolnym miejscu? Jeśli tak, to kiedy i dlaczego miałbyś to zrobić, czy jest to tylko błąd w książce?

+2

Jest to technika, najczęściej stosowana w języku C, do tworzenia lokalnych wartości tymczasowych po pierwszym wyciągu. Gdy wykonywanie kończy kończący się nawias klamrowy, wszystkie zmienne utworzone w tym zakresie znikają. –

Odpowiedz

13

Aparaty podobne do tych wskazują, że kod wewnątrz nawiasów jest teraz w innym zakresie. Jeśli próbujesz uzyskać dostęp do y poza nawiasami klamrowymi, zostanie wyświetlony błąd.

+0

To ma sens, ale to, co mnie myli, to myśl, że to musi być wewnątrz funkcji. Jeśli umieścisz nawiasy klamrowe w funkcji, nie rozumiem, dlaczego musiałbyś użyć funkcji zagnieżdżonej - czy jestem gdzieś w lewym polu? – Gary

+4

Funkcja ma swój własny zakres, ale możliwe jest również posiadanie zakresu w funkcji. Może to być bardzo przydatne, na przykład obiekty C++ mają destruktory, które można wykorzystać do uwolnienia zasobów w punkcie szczególnym, gdy obiekt wykracza poza zakres. Możesz wykonać tę funkcję pośrednią. – Benj

4

Definiuje zakres. Zmienna Y nie jest dostępna poza nawiasami klamrowymi.

4

Klamry oznaczają zakres, zmienna x będzie widoczna w zasięgu klamry wewnętrznej, ale nie będzie widoczna poza jej zakresem działania.

3

Klamry definiują poziom zakresu. Poza nawiasami klamrowymi y nie będzie dostępny.

1

To wygląda błędu (nie znając kontekstu)

Doing które zostały zapakowane wartość Y wewnątrz tych szelek, i jako taka nie jest dostępna poza nią.

Oczywiście, jeśli starają się wyjaśnić zakres, który mógłby być prawidłowy kod

6

To kwestia zmiennych zakresu ich, na przykład:

void f5() 
{ 
    int x = 1; 
    { 
     int y = 3; 
     y = y + x;   // works 
     x = x + y;   // works 
    } 
    y = y + x;    // fails 
    x = x + y;    // fails 
} 
3

Przy wyjściu zakres wewnętrzne obiekty są niszczone . Możesz na przykład zamknąć sekcję krytyczną w nawiasach klamrowych i skonstruować tam obiekt blokady. Wtedy nie musisz się martwić zapomnieniem o odblokowaniu - destruktor jest wywoływany automatycznie po opuszczeniu zasięgu - normalnie lub z powodu wyjątku.

Powiązane problemy