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;
}