Każdy programista rozpoczynający swoją przygodę z programowaniem w języku C++ musi poznać zmienne, ich typy oraz zasięg. Rodzaje zmiennych w C++ to po prostu podstawa, której nie można pominąć.
Jest to niezwykle ważne, by umiejętnie je dobierać oraz wykorzystywać, a także znać właściwości, które mogą nam pomóc w naszej karierze programisty. Omówię dzisiaj podstawy, a także ciut bardziej rozbuduję to, w jaki sposób możemy daną zmienną wykorzystać. Jeśli więc interesują Was typy zmiennych w C++, czytajcie dalej!
Czym jest zmienna?
Zanim dokładnie omówimy zmienne w C++, warto wyjaśnić, czym one dokładnie są. W dużym i niezbędnym skrócie można powiedzieć, że zmienną w informatyce charakteryzują trzy podstawowe wartości:
– nazwa
– adres
– wartość
Dodatkowo w językach ze statycznym typowaniem, jak C++ właśnie, musimy określić typ naszej zmiennej, aby móc ją poprawnie zadeklarować. Mówiąc jeszcze inaczej, deklaracje zmiennych muszą posiadać od razu określony typ.
Przykładowo zmienna:
int someVariable = 10;
To zmienna typu integer, przechowująca wartości całkowicie, o nazwie someVariable, do której przypisano wartość 10, a sama jest zagnieżdżona gdzieś w pamięci naszego komputera, zajmując przy tym 4 bajty (dokładny adres pomoże nam sprawdzić operator &). Wykorzystuje się tutaj skrót int, na przykład int main, aby zaoszczędzić miejsce.
Nazewnictwo zmiennych
Aby nazwać daną zmienną, musimy zmieścić się w pewnych ramach i trzymać określonych zasad.
Czego nam NIE wolno zrobić:
– używać pustych znaków, np. spacji (int some Variable
)
– zaczynać nazw od liczb (int 123someVariable
)
– nadawać jako nazwę słowo kluczowe (int switch
)
– korzystać ze znaków specjalnych (int some!Variable
)
– używać polskich liter (int śomęVąriabłę
)
– łączyć zmiennych ze wskaźnikami (int someVariable, *somePointer
)
– nadawać dwóch takich samych nazw (int someVariable i float someVariable
)
Są to zakazy, których trzeba przestrzegać, jeśli chcemy, aby nasz program się poprawnie skompilował.
Z drugiej strony, warto też znać dobre nawyki, jakie złapać powinien każdy programista przy nadawaniu nazw zmiennym:
– zapisywać je małymi literami (int some
)
– w przypadku kilku wyrazów stosować jasny i czytelny przekaz (int someVariable lub int some_variable
)
– wiele zmiennych zapisywać w jednej linii (int a, b, c, d, e
)
– jako nazwę stosować klarowny opis przeznaczenia (int enemyHealth
)
Kilka wzorców śmiało można by jeszcze wymienić, jednak to na tych wymienionych wyżej nie tyle należy, ile trzeba się wręcz skupić, zaczynając pisać w C++.
Należy też pamiętać, że wszystkie podane wyżej informacje składają się na coś, co nazywamy deklaracją zmiennej. Są to słowa, do których gęsto i często będziemy wracać.
Typy zmiennych
W C++ typy zmiennych to złożony temat. Zanim przejdę do właściwego omówienia, trzeba wspomnieć tutaj o przedrostkach signed oraz unsigned.
Określają nam, jaki przedział liczb jest w stanie przechować dana zmienna.
O ile każda deklaracja domyślnie jest ze znakiem, co oznacza, że signed int someVariable
równe jest int someVariable
.
Dzięki temu wiemy, że dana zmienna przechowuje liczby z zakresu od -2147483648, do 2147483647.
W przypadku unsigned int someVariable
sytaucja się drastycznie zmienia, a zakres to: 0 do 4294967295.
Należy o tym pamiętać, aby umiejętnie i z głową korzystać z danego przedrostka. W końcu aplikacja służąca do pomiaru temperatury nie może operować jedynie na liczbach dodatnich!
integer
Podstawowy typ zmiennej przechowujący wartości całkowite.
Jest on tak rozpoznawalny i powszechnie stosowany, że nawet osoby niezwiązane z informatyką, czy stricte programowanie, niejednokrotnie doskonale go kojarzą!
Oto jego krótka charakterystyka:
Deklaracja: int someVariable = 10;
Rozmiar: 4 bajty (32 bity)
Typ przechowywanych danych: liczby całkowite
Większość operacji początkujący programista będzie przeprowadzał właśnie na nim.
Trzeba też pamiętać, że rozmiar zmiennej zależny jest w dużej mierze od architektury naszego sprzętu oraz samego kompilatora, dlatego może się zdarzyć, że ktoś napotka na int o rozmiarze nie 4, a 2 bajtów.
Z tego samego też powodu, bardzo często int i long są sobie równoznaczne.
W moim wypadku dane oparte są na wyniku, jaki zwróciła funkcja sizeof() dla każdej zmiennej, a także GCC 7.2.0.
Warto jednak wiedzieć, że nie jest to jedyna możliwość deklaracji typu całkowitego w języku C++, istnieją także:
char
– Deklaracja: char someVariable = 122; lub char someVariable = 'z';
– Rozmiar: 1 bajt (8 bitów)
– Typ przechowywanych danych: liczby całkowite lub pojedyncze znaki
short int
– Deklaracja: short someVariable = 255; lub short int someVariable = 255;
– Rozmiar: 2 bajty (16 bitów)
– Typ przechowywanych danych: liczby całkowite
long int
– Deklaracja: long someVariable = 10; lub long int someVariable = 10;
– Rozmiar: 8 bajtów (64 bity)
– Typ przechowywanych danych: liczby całkowite
Spotkać można także zapis long long int
, który wynika z wymienionej wcześniej zależności, że sam long może (lecz nie musi) być równy 4 bajtom.
Oczywiście do każdego typu śmiało możemy dodać przedrostek unsigned, wedle potrzeb.
Dziwić może także obecność typu char, o którym szerzej rozpiszę się niżej – coby jednak nie mówić, jest to typ, który także przechowuje liczby całkowite, w końcu kod ASCII po coś istnieje.
float
Po przeczytaniu wcześniejszych wersów bardzo szybko nasuwa się myśl, co jeśli mam liczbę po przecinku? Np. 3.14? Co w danej sytuacji mogę zrobić?
Zadeklarowanie zmiennej int w taki sposób: int someVariable = 3.14
spowoduje, że wszystko, co po przecinku zostanie po prostu ucięte. Nie zaokrąglone – ucięte!
A to dlatego, że typ ten przechowuje jedynie liczby całkowite.
Z pomocą przychodzi nam float – typ zmiennoprzecinkowy.
To dzięki niemu oraz znakowi kropki, będącego uosobieniem przecinka, możemy zapisywać znacznie dokładniej wyniki naszych obliczeń.
Oto krótka charakterystyka:
Deklaracja: float fpUnit = 3.14 lub float fpUnit = 0.14 lub float fpUnit = .14;
Rozmiar: 4 bajty (32 bity)
Precyzja: 6-7 miejsc po przecinku
Typ przechowywanych danych: liczby zmiennoprzecinkowe
Czy to oznacza, że do float nie mogę przypisać po liczby całkowitej? Albo, dlaczego tylko .14 a nie 0.14?
Ależ nikt nam nie broni stosowania float w formie int. Jeśli jednak wiemy, że nie będziemy korzystać z przecinka, jaki ma to sens?
Wprowadza to tylko niepotrzebny zamęt i swego rodzaju utrudnia czytanie kodu.
Poza tym float powstał z myślą o precyzyjnych obliczeniach, do nawet 20. miejsc po przecinku!
A co z .14? Odpowiedź jest prosta.
Skoro jest kropka, a przed nią nie ma żadnej wartości, to kompilator po prostu wie, że tam stoi zwykłe 0.
Jest to usprawnienie pisania kodu na poziomie z wykorzystanie i++, w miejsce i+1.
Czy istnieje możliwość zwiększenia precyzji? Jak najbardziej!
Oto przykłady z krótkim opisem:
double
– Deklaracja: double fpUnit = 3.14 lub double fpUnit = 0.14 lub double fpUnit = .14;
– Rozmiar: 8 bajtów (64 bity)
– Precyzja: 15-16 miejsc po przecinku
-Typ przechowywanych danych: liczby zmiennoprzecinkowe
long double
– Deklaracja: long double fpUnit = 3.14 lub long double fpUnit = 0.14 lub long double fpUnit = .14;
– Rozmiar: 16 bajtów (128 bitów)
– Precyzja: 33-36 miejsc po przecinku
– Typ przechowywanych danych: liczby zmiennoprzecinkowe
Jak widać – ze zwiększaniem precyzji naszych obliczeń, znacznie wzrasta także rozmiar samej zmiennej.
Dlatego tak ważne jest stosować odpowiedni typ, żeby nie zabić optymalizacji naszego kodu!
Dodatkowo możemy także wspomnieć o precyzji naszych obliczeń i tym jak mają być traktowane, np. zaokrąglanie do dwóch miejsc po przecinku.
Coś takiego jest możliwe, a do tego bardzo często i gęsto się z tego korzysta – my dzisiaj tylko o tym wspomnimy, na szerszy opis przyjdzie czas przy operacjach matematycznych.
char
Mimo że przelotnie o nim wspomniałem, przy typie całkowitym, to jego pierwotne przeznaczenie jest zgoła inne.
Owszem, przechowuje on liczby z zakresu -128 do 127, ale jest to typ znakowy.
Liczby robią tutaj reprezentację kodu ASCII. To dzięki nim nasz program potrafi przechowywać pojedyncze litery czy znaki specjalne.
Ważne jest, aby zapamiętać, że tylko pojedyncze znaki.
Do całych łańcuchów wykorzystuje się tablice albo typ string, którego dzisiaj nie będę omawiał, zasługuje on na swój osobny artykuł.
Krótka charakterystyka char wygląda następująco:
Deklaracja: char z = 'z'; lub char z = 122;
Rozmiar: 1 bajt (8 bitów)
Typ przechowywanych danych: pojedyncze znaki lub liczby całkowite
Elastyczność i szeroka gama zastosowań, polegająca głównie na umiejętnościach programisty, sprawia, że char jest podstawowym typem danych, który każdy powinien znać. Jest też coś takiego, jak unsigned char, ale to omówimy przy innej okazji.
bool
Jest typem logicznym, bardzo prostym w swoim zastosowaniu.
Oznacza albo prawdę, albo fałsz. Czysto teoretycznie w języku C++ wszystko większe od 0 jest prawdą, więc równie dobrze można wykorzystać typ int, char, a nawet jakby ktoś chciał, to long double.
Jednak znaczącą ich wadą jest rozmiar, bowiem boolean zajmuje zaledwie jeden bajt. Więcej mu po prostu nie potrzeba.
Dodatkowo nikt nie zmusza nas do korzystania z 0 i 1! Oto dlaczego:
Deklaracja: bool onlyTrue = true; lub bool onlyTrue = 1;
Rozmiar: 1 bajt (8 bitów)
Typ przechowywanych danych: logiczna prawda lub fałsz
Osobiście nie jest zwolennikiem słownego zapisywania tych wartości, niemniej jednak bool nam to umożliwia w prosty i przejrzysty sposób.
Podsumowanie
Typów zmiennych oraz wariacji na ich temat jest znacznie więcej, zarówno, jeśli chodzi o typy do wartości zmiennych, jak i stałych.
W tym artykule pokrótce przedstawiłem najważniejsze informacje o podstawowych typach (konkretnie chodzi tutaj o typy danych C++), jakie powinien znać każdy programista.
W przyszłości będzie należało także wspomnieć o string, o tym jako można go pominąć, dlaczego C++ jest znacznie bardziej przejrzyste, niż C, o zasięgach zmiennych, właściwościach tych niewyzerowanych i wiele, wiele więcej.
Jak to mówią: stay tuned and cheers!
WARTO PRZECZYTAĆ: