Zmienne

Titter

Zmienna to referencja do konkretnej komórki w pamięci RAM.
Każda zmienna w C ma:

  • nazwę
  • typ przechowywanych danych
    </span>
    //zmienna typu integer - deklaracja
    int przykladowa_zmienna;

Zmienne można deklarowac w dowolnym miejscu w kodzie.
Zmienne niezadeklarowane nie są rozpoznawane i przy próbie kompilacji zostanie zgłoszony odpowiedni błąd.
Podczas deklaracji zmiennej można ustalić jej wartość (początkową):

int zmienna=5;

(zalecam zerować* każdą zmienną)

Typy zmiennych:

//najważniejsze liczbowe
byte
int
short int
long int
double
float
//tekstowe
char
string
pchar

Każdy typ ma odpowiedni (zależny od architektury procesora) rozmiar, np.:
int - 4B
double - 8B
char -1B

Rozmiar każdego typu można sprawdzić wykonujac taki oto kod:

#include <iostream>
#include <conio.h>
#include <stdlib.h>
 
using namespace std;
 
void main()
{
    cout<<sizeof(double);
    getch();
}

(w funkcji sizeof() wpisując konkretny typ jaki nas interesuje)

Z nazwami zmiennych związane są pewne zasady, których warto przestrzegać:

  • niestosowanie polskich (narodowych) znaczków (chyba, że .NET ;P)
  • niemożliwe jest używanie spacji i innych znaków niedozwolonych w nazwach w danym systemie
  • niedozwolone jest również rozpoczynanie nazw od cyfr
  • warto stosować nazwy opisowe (nazwa, która mówi do czego służy dana zmienna)
  • w danym programie nie mogą istnieć dwie takie same nazwy zmiennych (poza kilkoma przypadkami)

Napisałem, że nie może być dwóch takich samych nazw zmiennych w kodzie. Otóż nie do końca jest to prawda, bowiem C pozwala na tzw. przysłanianie zmiennych. Oto przykład:

int foo(int x)
{
    if (x==2) return 10;
    else return 0;
}
 
void main()
{
    int x=0;
    {
     int x=2;
    cout << foo(x);
     }
     cout << foo(x);
}

W kodzie zostały użyte 3 zmienne o tej samej nazwie, i to działa, ale jak?
Język C wyróżnia tzn. segmenty (bloki - każdy wyznaczany jest przez {}) kodu. Dla każdego takiego bloku tworzy osobny stos z danymi w pamięci i dlatego nie myli jednego x-a z jednego segmentu z x-em z drugiego segmentu. Dlatego też kod z przykładu się wykona i wypisze na ekranie 10, potem 0. Gdy odwołujemy się do jakiejś zmiennej jest ona szukana przez kompilator w najbliższym segmencie w strukturze (bloki można oczywiście zagnieżdżać). A co z x-em w deklaracji funkcji?? To tez jest inny x a x przekazywany do funkcji to nie ten sam x. Taka zbieżność jest często myląca, w szczególności gdy przekazujemy parametr przez referencję!

Kilka przykładów czytelnych nazw (dotyczy nazw złożonych):
MojaDlugaNazwa
moja_dluga_nazwa

rzadziej stosowane:
mojaDLUGAnazwa


*zerować - ustalać wartość odpowiadającą zeru dla liczb, zgodną z deklarowanym typem

4 komentarzy

Co znowu jest źle? Bo teraz nie kumam!

Titter, to jest C/C++

dobrze ale to jest kategoria C ;P
spoko, jak będę miał trochę czasu, ale przecież każdy to może poprawić, nawet Ty! ;D

" niestosowanie polskich (narodowych) znaczków" a .NET to co? :P
Ogólnie na dzień dzisiejszy tekst nieco do poprawy...