Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

czwartek, 10 lutego 2011

Kurs języka C: Zmienne lokalne blokowe


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
Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

1 komentarz:

  1. Przeklejam tutaj mój przykład lepiej obrazujący "przykrywanie" zmiennych.

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

    OdpowiedzUsuń

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.