Autor: Dondu
Kurs języka C: Spis treści
Zmienne lokalne blokowe, to zmienne dostępne tylko i wyłącznie w ściśle określonej części funkcji.
W artykule o zmiennych lokalnych poznałeś, co to są zmienne lokalne. Zmienne lokalne blokowe są następnym etapem zawężania dostępności danej zmiennej w funkcji. Zawężenia takiego dokonuje się poprzez określenie znakami początku i końca bloku, obszaru w którym dana zmienna jest zadeklarowana (widoczna).
Znakami początku i końca bloku są odpowiednio nawiasy { oraz }.
Przykład 1 (w kompilatorze)
int main(void)
{
//zmienna lokalna dostępna tylko dla funkcji main()
char ilosc_koni = 5;
{ //początek bloku
//zmienna dostępna tylko w obrębie bloku
char ilosc_kotow = 16;
//wyświetl zmienne
printf("W bloku ilosc_koni = %d \n", ilosc_koni);
printf("W bloku ilosc_kotow = %d \n", ilosc_kotow);
} //koniec bloku
//wyświetl zmienne
printf("Poza blokiem ilosc_koni = %d \n", ilosc_koni);
return 0;
}
A teraz sprawdźmy, czy zmienna zdefiniowana w bloku jest dostępna poza blokiem, dodając printf()?:Przykład 2 (w kompilatorze)
printf("Poza blokiem ilosc_kotow = %d \n", ilosc_kotow);
Kompilator zrewanżował się nam komunikatem:
error: ‘ilosc_kotow’ undeclared (first use in this function)
co utwierdza nas w tym, że zmienna ilosc_kotow jest dostępna tylko w obrębie bloku.
Przykrywanie zmiennych o tej samej nazwie
Jeżeli w bloku zdefiniujesz zmienną X o tej samej nazwie, co istniejąca zmienna globalna lub lokalna zdefiniowana poza blokiem, to zmienna X w ramach bloku "przykrywa" te zmienne.
Przykład 3 (w kompilatorze)
int main(void)
{
//zmienna lokalna dostępna tylko dla funkcji main()
char ilosc_koni = 5;
{ //początek bloku
//zmienna przykrywa zmienną spoza bloku, ponieważ ma taką samą nzawę
char ilosc_koni = 22;
//wyświetl zmienne
printf("W bloku ilosc_koni = %d \n", ilosc_koni);
} //koniec bloku
//wyświetl zmienne
printf("Poza blokiem ilosc_koni = %d \n", ilosc_koni);
return 0;
}
Kiedy można się z tym spotkać?
Blok definiowany jest poprzez nawiasy { oraz }. Stąd jeżeli zdefiniujesz zmienną na przykład w ramach pętli do{ } while( ), to zmienna ta będzie zmienną lokalną blokową dostępną jedynie w tej pętli:
Przykład 4 (w kompilatorze)
int main(void)
{
//zmienna lokalna dostępna tylko dla funkcji main()
char licznik = 1;
do //początek pętli
{ //początek bloku pętli
//zmienna dostępna tylko w obrębie bloku
char ilosc_kotow = 16;
//wyświetl zmienną
printf("W bloku ilosc_kotow = %d \n", ilosc_kotow);
} //koniec bloku pętli
while(++licznik <= 5); //koniec pętli
return 0;
}
Sprawdźmy, czy faktycznie zmienna jest dostępna tylko w pętli, dodając printf():
Przykład 5 (w kompilatorze)
printf("Poza blokiem ilosc_kotow = %d \n", ilosc_kotow);
Tym razem kompilator zgłasza błąd braku dostępu do zmiennej:
error: ‘ilosc_kotow’ undeclared (first use in this function)
Podsumowanie
Jak zauważyłeś na podstawie powyższych przykładów, każda zmienna lokalna jest zmienną lokalną blokową, tylko raz tym blokiem jest cała funkcja, a innym razem jest to tylko fragment funkcji.
Kurs języka C: Spis treści
6





Przeklejam tutaj mój przykład lepiej obrazujący "przykrywanie" zmiennych.
OdpowiedzUsuńint main(void){
char zmienna = 5;
printf("zmienna przed if = %d \n", zmienna);
if(zmienna == 5){
char zmienna = 1; // deklaracja zmiennej widocznej tylko wewnątrz if, a mającej taką samą nazwę :)
printf("zmienna wewnątrz if = %d \n", zmienna);
zmienna++;
// wyświetl zmienną po inkrementacji
printf("zmienna po inkrementacji = %d \n", zmienna);
}
// jaką wartość ma zmienna po wyjściu z if?
printf("zmienna po wyjściu z if = %d \n", zmienna);
return 0;
}