2. Typy danych
2.1. Zmienne i sta艂e
Dane programu zapisywane s膮 w postaci zmiennych lub sta艂ych.
Zmienna (ang. variable) to pewien obszar pami臋ci o nadanej symbolicznej nazwie, w kt贸rym mo偶na przechowywa膰 dane, pobiera膰 je i zmienia膰 podczas wykonywania programu. Zmienn膮 nazywamy inaczej obiektem.
Sta艂a (litera艂, ang. literal constant) to dana zapisana w spos贸b dos艂owny (liczba, znak, napis), nie zmienia si臋 podczas wykonywania programu.
Przyk艂ad:
i=5;
2.2. Identyfikatory czyli nazwy
Identyfikator (ang. identifier) to nazwa s艂u偶膮ca do oznaczania obiekt贸w zdefiniowanych przez u偶ytkownika w programie (zmiennych, funkcji, nazwanych sta艂ych).
Nazwa mo偶e zawiera膰 litery, cyfry, znak podkre艣lenia, przy czym mo偶e rozpoczyna膰 si臋 od litery lub znaku podkre艣lenia.
Rozr贸偶niane s膮 ma艂e i wielkie litery. Oznacza to, 偶e x oraz X to dwie r贸偶ne zmienne.
Nazwa nie mo偶e by膰 s艂owem kluczowym j臋zyka C++ (np. nazw膮 instrukcji if) ani by膰 u偶ywana przez bibliotek臋 standardow膮.
Standard ANSI C ogranicza rozmiar nazw do 31 znak贸w. Standard C++ ANSI/ISO nie nak艂ada ogranicze艅 na d艂ugo艣膰 nazw. Jednak偶e wi臋kszo艣膰 kompilator贸w przyjmuje swoje maksymalne d艂ugo艣ci nazw okre艣lane w opcjach kompilatora.
Przyk艂ady:
Poprawne nazwy |
Niepoprawne nazwy |
licznik_12 |
12_licznik |
test12 |
test-12 |
test_12 |
test..12 |
Ustalaj膮c nazwy dobrze jest stosowa膰 kilka og贸lnie przyj臋tych zasad:
powinno to by膰 s艂owo kojarz膮ce si臋 z przeznaczeniem zmiennej
najcz臋艣ciej u偶ywa si臋 ma艂ych liter, np. indeks nie za艣 INDEKS
je艣li nazwa sk艂ada si臋 z kilku s艂贸w, poszczeg贸lne s艂owa oddziela si臋 znakiem podkre艣lenia, albo zaczyna si臋 ka偶de s艂owo od wielkiej litery opr贸cz pierwszego
wybrany styl tworzenia nazw powinien by膰 jednorodny w ca艂ym programie
2.3. S艂owa kluczowe
W j臋zyku C++ s艂owa o zastrze偶onym znaczeniu nazywane s膮 s艂owami kluczowymi (ang. keywords). Jest ich聽63.
Tych s艂贸w nie mo偶na u偶ywa膰 jako nazwy zmiennych i innych obiekt贸w.
Przyk艂ady s艂贸w kluczowych:
int - u偶ywane jest do okre艣lenia typu ca艂kowitego
if - instrukcja wyboru
sizeof - operator zwracaj膮cy rozmiar argumentu w bajtach
2.4. Podstawowe typy danych
Dane (zmienne, sta艂e, warto艣ci wyra偶e艅, warto艣ci generowane przez funkcje) przechowywane s膮 w pami臋ci jako ci膮g bit贸w.
Typ danych - nadaje znaczenie ci膮gowi bit贸w o okre艣lonym adresie i d艂ugo艣ci:
okre艣la ile pami臋ci potrzeba do przechowania danej,
jakie operacje mog膮 by膰 wykonane na danej,
jak te operacje s膮 interpretowane.
Zbi贸r typ贸w prostych dost臋pnych w j臋zyku C++ i C jest podobny.
Typy proste (skalarne, ang. scalar types) s膮 niepodzielne, wykorzystuje si臋 je do przechowywania pojedynczych danych.
typy arytmetyczne: do przechowywania liczb ca艂kowitych, rzeczywistych, znak贸w,
typ logiczny: do przechowywania warto艣ci logicznych prawda i fa艂sz (nie ma go w C)
typ wska藕nikowy: do przechowywania adres贸w obiekt贸w danego typu
typ referencyjny: pozwala nada膰 inn膮 nazw臋 obiektowi (nie ma go w C)
typ wyliczeniowy: do reprezentowania zbioru warto艣ci podanych przez u偶ytkownika.
Typy z艂o偶one (ang. aggregate types): sk艂adaj膮 si臋 z element贸w typ贸w prostych oraz innych typ贸w z艂o偶onych. Wykorzystywane do przechowywania danych powi膮zanych ze sob膮. Do聽typ贸w z艂o偶onych nale偶膮:
tablice obiekt贸w danego typu,
struktury (i klasy) zawieraj膮ce zestawy obiekt贸w r贸偶nego typu,
unie zawieraj膮ce dowolny z zestawu obiekt贸w o r贸偶nych typach,
funkcje zwracaj膮ce warto艣ci danego typu.
Typ void: typ ten ma specjalne zastosowania, nie ma obiekt贸w typu void; u偶ywany jest na przyk艂ad wtedy, kiedy chcemy powiedzie膰, 偶e funkcja nie zwraca 偶adnej warto艣ci.
2.4.1. Typy arytmetyczne
Typy arytmetyczne s艂u偶膮 do przechowywania liczb ca艂kowitych, rzeczywistych i znak贸w.
S膮 one dost臋pne w r贸偶nych rozmiarach, dzi臋ki czemu programista mo偶e wybra膰 ilo艣膰 zu偶ywanej pami臋ci, precyzj臋 i zakres przechowywanych liczb.
Rozmiary i zakresy danych poszczeg贸lnych typ贸w mog膮 by膰 r贸偶ne dla r贸偶nych implementacji.
Dla typ贸w int i char okre艣lana jest najmniejsza i najwi臋ksza warto艣膰 liczby, kt贸ra mo偶e by膰 przechowywana w聽zmiennej tego typu.
Dla typ贸w float i double okre艣lane s膮:
najwi臋ksza liczba mo偶liwa do przedstawienia
najmniejsza liczba mo偶liwa do przedstawienia
rozr贸偶nialno艣膰 - najmniejsza dodatnia liczba x taka, 偶e 1.0+x 鈮 1.0
dok艂adno艣膰 - liczba cyfr dziesi臋tnych, kt贸re mog膮 by膰 przedstawione dok艂adnie
Najwi臋ksze i najmniejsze warto艣ci ka偶dego typu w danej implementacji s膮 podane w聽standardowych plikach nag艂贸wkowych: limits.h i float.h .
Niekt贸re nazwy typ贸w mo偶na podawa膰 w postaci pe艂nej i skr贸conej. Na przyk艂ad m贸wi膮c o typie signed聽int najcz臋艣ciej pomija si臋 kwalifikator i stosuje si臋 nazw臋 kr贸tsz膮 int.
D艂ugi format nazwy typu |
Kr贸tki format nazwy typu |
char signed char unsigned char signed short int unsigned short int signed int unsigned int signed long int unsigned long int float double long double |
char signed char unsigned char short unsigned short int (lub signed) unsigned long unsigned long float double long double |
Standard C++ ANSI/ISO okre艣la tylko minimum jakie musi spe艂nia膰 dany typ:
Nazwa typu |
Zakresy przechowywanych warto艣ci |
Do czego s艂u偶y |
||
Typy ca艂kowite |
||||
char |
Musi by膰 wystarczaj膮co du偶y, aby mo偶na by艂o przechowa膰 w nim dowolny znak ze zbioru wspieranego przez implementacj臋, np. 127 znak贸w zbioru podstawowego ASCII lub 255 znak贸w zbioru rozszerzonego ASCII. Zmienna typu char przyjmuje warto艣ci takie jak signed聽char lub unsigned聽char w聽zale偶no艣ci od implementacji. |
bardzo ma艂e liczby ca艂kowite, kody znak贸w, np. ASCII |
||
signed char |
-127 do 127 |
bardzo ma艂e liczby ca艂kowite, kody znak贸w, np. ASCII |
||
unsigned char |
0 do 255 |
bardzo ma艂e liczby ca艂kowite dodatnie, kody ASCII |
||
int |
Obiekty typu int zajmuj膮 jedno s艂owo; Je艣li w danym systemie operacyjnym przyj臋te jest s艂owo 16 bitowe oznacza to liczby z聽zakresu --32 768 do 32 767; Je艣li za艣 s艂owo wynosi 32 bity, zakres liczb wynosi od -2聽147聽483聽648 do 2 147 483 647 |
艣rednie lub du偶e liczby ca艂kowite |
||
short int |
Co najmniej po艂ow臋 s艂owa; jednak w聽komputerach 16 bitowych przyj臋te jest, 偶e typ short i int maj膮 ten sam rozmiar |
艣rednie liczby ca艂kowite |
||
long int |
Co najmniej tyle co int; w聽komputerach 16 bitowych przyj臋te jest u偶ywa膰 dwa s艂owa, w komputerach 32 bitowych zazwyczaj int i long int maj膮 te same rozmiary |
du偶e liczby ca艂kowite |
||
unsigned int |
Taki sam rozmiar jak dla int. Dla int 16 bitowego oznacza to warto艣ci od 0 do 65 535 ; za艣 dla int 32 bitowego od 0 do 4 294 967 295 |
艣rednie lub wi臋ksze liczby ca艂kowite dodatnie |
||
unsigned short int |
Taki sam rozmiar co short聽int; Dla short 16 bitowego oznacza to warto艣ci od 0 do 65 535. |
艣rednie liczby ca艂kowite dodatnie |
||
unsigned long int |
Taki sam rozmiar co long聽int; Dla long聽int 32 bitowego oznacza to warto艣ci od 0 do 4 294 967 295 |
bardzo du偶e liczby ca艂kowite dodatnie |
||
Typy rzeczywiste |
||||
float |
zale偶y od implementacji, zbi贸r warto艣ci float stanowi podzbi贸r warto艣ci double |
liczby rzeczywiste przedstawione z聽pojedyncz膮 dok艂adno艣ci膮 - przyk艂adowo ma艂e liczby rzeczywiste o 7聽cyfrach dok艂adno艣ci |
||
double |
zawiera co najmniej zbi贸r warto艣ci float, co najmniej taka dok艂adno艣膰 jak float, |
liczby rzeczywiste przedstawione z聽podw贸jn膮 dok艂adno艣ci膮 - przyk艂adowo du偶e liczby rzeczywiste o 15聽cyfrach dok艂adno艣ci |
||
long double |
zawiera zbi贸r warto艣ci double, co聽najmniej taka dok艂adno艣膰 jak double, |
bardzo du偶e liczby rzeczywiste (18聽cyfr dok艂adno艣ci) |
Przyk艂ad: implementacja typ贸w w kompilatorze Borland C++ - wersja DOS
Nazwa typu |
Rozmiar (bity) |
Zakres przechowywanych warto艣ci |
Do czego s艂u偶y |
ca艂kowity |
|
liczba ca艂kowita |
|
short int |
16 |
-32768 do 32767 |
艣rednie liczby ca艂kowite |
int |
16 |
-32768 do 32767 |
艣rednie liczby ca艂kowite |
long int |
32 |
-2 147 483 648 do 2 147 483 647 |
du偶e liczby ca艂kowite |
modyfikacje |
|
dodatnia liczba ca艂kowita |
|
unsigned int |
16 |
0 do 65535 |
wi臋ksze liczby ca艂kowite dodatnie |
unsigned long int |
32 |
0 do 4 294 967 295 |
bardzo du偶e liczby ca艂kowite dodatnie |
zmiennopozycyjny |
|
liczba rzeczywista |
|
float |
32 |
1,1*10-38 do 3,4*10 38 |
ma艂e liczby rzeczywiste (7聽cyfr dok艂adno艣ci) |
double |
64 |
2,2*10-308 do 1,7*10308 |
du偶e liczby rzeczywiste (15聽cyfr dok艂adno艣ci) |
long double |
80 |
3,3*10-4917 do 1,1*104932 |
bardzo du偶e liczby rzeczywiste (18聽cyfr dok艂adno艣ci) |
znakowy (specjalny ca艂kowity) |
|
znak lub ma艂a liczba ca艂kowita |
|
char |
8 |
-128 do 127 |
bardzo ma艂e liczby ca艂kowite, znaki ASCII |
signed char |
8 |
-128 do 127 |
|
unsigned char |
8 |
0 do 255 |
bardzo ma艂e liczby ca艂kowite dodatnie, pe艂en zestaw kod贸w PC |
Uwaga:
Typ char w r贸偶nych kompilatorach mo偶e by膰 interpretowany jako signed char lub unsigned char. Ustawienie to prawie zawsze da si臋 zmieni膰.
Borland C++ domy艣lnie przyjmuje, 偶e char oznacza signed char, o ile u偶ytkownik nie zmieni ustawienia domy艣lnego.
2.4.2. Typ logiczny bool
Typ logiczny s艂u偶y do przechowywania warto艣ci logicznych.
Zmienne tego typu mog膮 przyjmowa膰 dwie warto艣ci: true (prawda) i false (fa艂sz).
Typ logiczny wprowadzono w j臋zyku C++. W j臋zyku C do wyra偶enia warto艣ci logicznych wykorzystywany jest typ int. Przyj臋to nast臋puj膮c膮 konwencj臋: 0 oznacza fa艂sz, warto艣膰 r贸偶na od zera oznacza prawd臋.
2.5. Nadawanie typu zmiennym i sta艂ym
Typ i nazw臋 zmiennej (ang. variable) okre艣la u偶ytkownik jawnie za pomoc膮 odpowiedniej deklaracji, bior膮c pod uwag臋 dane, kt贸re maj膮 by膰 w zmiennej przechowywane.
Deklaracja typu sk艂ada si臋 ze specyfikatora typu i wyst臋puj膮cej po niej nazwy zmiennej. Musi by膰 zako艅czona 艣rednikiem.
Je艣li definiujemy kilka zmiennych tego samego typu mo偶na je umie艣ci膰 w jednej deklaracji typu, oddzielaj膮c nazwy przecinkami.
Przyk艂ady:
int licznik; /* zmienna typu int o nazwie licznik
(mo偶e przechowywa膰 liczby ca艂kowite z zakresu okre艣lonego typem int) */
int a,b,c; /* trzy zmienne a, b, c tego samego typu */
double suma; /* zmienna typu double o nazwie suma
(mo偶e przechowywa膰 l. rzeczywiste z zakresu okre艣lonego typem double)*/
char znak; /* zmienna typu char o nazwie znak
(mo偶e przechowywa膰 znaki lub ma艂e liczby ca艂kowite
z zakresu okre艣lonego typem char)*/
bool flaga; /* zmienna typu bool o nazwie flaga
(mo偶e przechowywa膰 warto艣膰 true lub false ) */
Deklaracja typu musi poprzedza膰 w tek艣cie programu u偶ycie zmiennej.
W j臋zyku C deklaracja typu mog艂a wyst臋powa膰 tylko na pocz膮tku funkcji (programu lub bloku), przed instrukcjami zwi膮zanymi z wykonywaniem programu.
W j臋zyku C++ deklaracja typu mo偶e wyst臋powa膰 w dowolnym miejscu tekstu programu, byle przed u偶yciem zmiennej.
Typ sta艂ej (ang. literal constant) okre艣la u偶ytkownik odpowiednio zapisuj膮c dan膮 w instrukcji.
int licznik = 0; // sta艂a 0 typu int: liczba bez kropki dziesi臋tnej
double suma = 0.; // sta艂a 0 typu double: liczba z kropk膮 dziesi臋tn膮
char c='*'; // sta艂a * typu char: znak z apostrofach
bool b=false; // sta艂a false typu bool: jedna z dw贸ch warto艣ci false
// lub true
2.6. Nadawanie warto艣ci zmiennym
Zmienna przyjmuje warto艣ci w wyniku inicjowania, przypisania lub wczytania.
Inicjowanie: jest to nadanie pierwszej warto艣ci zmiennej podczas jej definiowania, nie jest obowi膮zkowe:
int ile,liczba=20; /* ile nie ma warto艣ci pocz膮tkowej */
float powierzchnia=4.5;
long odl_od_Ksiezyca=238857;
Zmienna, kt贸rej nie nadano warto艣ci pocz膮tkowej to zmienna niezainicjowana (ang. uninitialized).
Zmienna zdefiniowana niezainicjowana ma pewn膮 warto艣膰, ale warto艣膰 ta jest nieokre艣lona - wynik tego, 偶e podczas rezerwowania obszaru pami臋ci dla zmiennej, pami臋膰 ta nie jest czyszczona (Uwaga: s膮 wyj膮tki - pewne zmienne s膮 automatycznie inicjowane z warto艣ci膮 0, patrz: Zasi臋g deklaracji i czas trwania obiekt贸w).
// Przyk艂ad b艂臋dnie dzia艂aj膮cego programu
#include <iostream.h>
int main()
{
int k;
cout << "Wartosc k: " << k << endl;
return 0;
}
Program si臋 skompilowa艂 i mo偶na by艂o go uruchomi膰. Kompilator Borland C++ ostrzeg艂 tylko: Possible use of 'k' before definition. Jednak偶e wynik wykonania programu jest przypadkowy:
Wartosc k: 12
Przypisanie: w trakcie dzia艂ania programu zmiennej przypisuje si臋 warto艣膰 za pomoc膮 operatora
przypisania = :
int ile;
float powierzchnia;
ile=20; // przypisanie
powierzchnia=4.5; // przypisanie
Wczytanie: w trakcie dzia艂ania programu mo偶na wczytywa膰 warto艣ci do zmiennych na przyk艂ad za pomoc膮 konstrukcji cin >> nazwa_zmiennej:
int ile;
cin >> ile;
2.7. Sta艂e
Sta艂e (litera艂y, ang. literal constant) reprezentuj膮 ustalone warto艣ci, kt贸re nie mog膮 by膰 zmienione podczas dzia艂ania programu.
Z ka偶d膮 sta艂膮 zwi膮zany jest jej typ i warto艣膰.
2.7.1. Sta艂e liczbowe - ca艂kowite i zmiennopozycyjne
Sta艂a ca艂kowita to liczba ca艂kowita ewentualnie poprzedzona znakiem.
Domy艣lnym typem sta艂ych ca艂kowitych jest typ signed int . Przyk艂ady:
0 1234 -1234
Sta艂a zmiennopozycyjna to liczba zawieraj膮ca kropk臋 dziesi臋tn膮, wyk艂adnik, mo偶e by膰 poprzedzona znakiem kropki dziesi臋tnej.
Domy艣lnym typem sta艂ych zmiennopozycyjnych jest typ double. Przyk艂ady:
3.14 3. 0.14 .14 1.2e5 2e-5 0.0 0.
gdzie:
1.2e5 oznacza 1,2*105
2e-5 oznacza 2*10-5
Pozosta艂e typy wymagaj膮 wpisania odpowiedniego specyfikatora.
Sta艂a |
Typ sta艂ej |
1000L |
long int - litera L za liczb膮 ca艂kowit膮 |
1024l |
long int - litera l za liczb膮 ca艂kowit膮 |
128u |
unsigned int - litera u za liczb膮 ca艂kowit膮 (ma艂a lub wielka) |
1010LU |
unsigned long int - litery LU za liczb膮 (w dowolnej kolejno艣ci) |
3.14f |
float - litera f za liczb膮 z kropk膮 dziesi臋tn膮 (ma艂a lub wielka) |
1.0L |
long double - litera L za liczb膮 z kropk膮 dziesi臋tn膮 (ma艂a lub wielka) |
R贸偶ne zapisy sta艂ej ca艂kowitej
Sta艂e ca艂kowite mo偶na zapisywa膰 na trzy sposoby:
dziesi臋tnie: 20
贸semkowo: 024 - liczba jest poprzedzona cyfr膮 0 (dziesi臋tnie ma warto艣膰 20)
szesnastkowo: 0x14 - liczba jest poprzedzona znakami 0x (lub 0X)
Dotyczy to wszystkich typ贸w sta艂ych ca艂kowitych. Przyk艂ad: 0x12345LU
2.7.2. Sta艂e logiczne
Sta艂e logiczne maj膮 dwie warto艣ci: true i false.
2.7.3. Sta艂e znakowe
Sta艂a znakowa (ang. character constant) to znak umieszczony w apostrofach: 'a'
Typem sta艂ej znakowej jest char.
Warto艣膰 sta艂ej znakowej to kod liczbowy znaku. Do reprezentacji znak贸w u偶ywany jest kod ASCII.
Przyk艂ady:
'a' (kod 97) - kompilator zapami臋tuje znak 'a' jako liczb臋 97
'A' (kod 65)
'0' (kod 48)
'8' (kod 56)
' ' (kod 32)
Znak mo偶na podawa膰 r贸wnie偶 w postaci liczby ca艂kowitej - kodu ASCII znaku:
char znak; // deklaracja zmiennej typu char
znak='a'; // przypisanie warto艣ci kodu znaku 'a'
znak=97; // to samo - kod podany dziesi臋tnie
Znaki niedrukowalne wymagaj膮 poprzedzenia znakiem odwr贸conego uko艣nika (ang. backslash).
Przyk艂ady:
'\n' - koniec linii (ang. new line), kod ASCII 10
'\r' - przesuni臋cie do pocz膮tku wiersza (ang. carriage return), kod ASCII 13
'\a' - sygna艂 d藕wi臋kowy (ang. alert), kod ASCII 7
'\0' - znak pusty (ang. null), kod ASCII 0
Znak uko艣nika mo偶na u偶y膰 wraz z 贸semkowym lub szesnastkowym przedstawieniem kodu znaku.
Przyk艂ad: r贸偶ne sposoby przypisania znaku 'a' do zmiennej znak
char znak;
znak='a'; // przypisanie warto艣ci kodu znaku 'a'
znak=97; // to samo - kod podany dziesi臋tnie
znak=0141; // to samo - kod podany 贸semkowo
znak=0x61; // to samo - kod podany szesnastkowo
znak='\141'; // to samo - kod 贸semkowy
znak='\x61'; // to samo - kod szesnastkowy
Je艣li chcemy przedstawi膰 uko艣nik to musimy u偶y膰 sekwencji '\\' .
2.7.4. Sta艂e napisowe
Sta艂a napisowa (艂a艅cuch, litera艂, tekst ang. string constants, string literals) jest to ci膮g znak贸w umieszczony w聽cudzys艂owach:
"Witamy"
Typem sta艂ej znakowej jest tablica typu char (ci膮g bajt贸w przylegaj膮cych do siebie).
Sta艂a napisowa jest pami臋tana jako sekwencja znak贸w zako艅czona znakiem pustym ('\0').
Wi臋cej na temat sta艂ych znakowych podczas omawiania tablic i wska藕nik贸w.
Przyk艂ady wykorzystania sta艂ych napisowych:
cout << "Witamy!";
cout << "Witamy!\n";
cout << "Witamy\nw szkole\n");
cout << "Lp.\tNazwisko";
2.8. Modyfikator typu const
Modyfikator const przekszta艂ca obiekt w sta艂膮 (ang. constant). Warto艣膰 takiego obiektu okre艣lana jest podczas definiowania i nie mo偶e p贸藕niej ulec zmianie. Jest przeznaczona tylko do czytania (ang. read only).
Cz臋sto tego typu obiekt nazwa si臋 sta艂膮 symboliczn膮 (ang. named constant), w odr贸偶nieniu od sta艂ej zapisywanej dos艂ownie (ang. literal constant) np. w postaci liczby.
Przyk艂ad:
const int id=12345;
const int max=100;
...
id=10000; // B艁膭D! Pr贸ba przypisania nowej warto艣ci
int tab[max]; // Poprawne u偶ycie: sta艂a mo偶e by膰
// u偶ywana do okre艣lenia wymiaru tablicy
Warto艣膰 sta艂ej mo偶e by膰 okre艣lana za pomoc膮 innej sta艂ej.
const int odlegloscMile = 3959;
const int odlegloscKm = 1.609*odlogloscMile;
Zalet膮 stosowania sta艂ych symbolicznych jest 艂atwiejsza piel臋gnacja kodu programu. W razie zmiany warto艣ci sta艂ej wystarczy zmieni膰 wiersz z jej definicj膮.
Eliminujemy w ten spos贸b istnienie w programie magicznych liczb, reprezentuj膮cych jakie艣 za艂o偶enie odno艣nie programu, np. jakie艣 przeliczniki lub rozmiary tablic. Je艣li za艂o偶enia te b臋dziemy zapisywa膰 za pomoc膮 dobrze skomentowanych sta艂ych symbolicznych, 艂atwiej b臋dzie zmienia膰 czy weryfikowa膰 program.
Z informacji o tym, 偶e pewna warto艣膰 nie zmienia si臋 podczas wykonywania programu mo偶e r贸wnie偶 korzysta膰 kompilator buduj膮c bardziej efektywny kod.
2.9. Definiowanie nazw typ贸w - typedef
Za pomoc膮 konstrukcji typedef mo偶na nada膰 now膮 nazw臋 (synonim) istniej膮cemu typowi. Je艣li na przyk艂ad wpiszemy nast臋puj膮c膮 definicj臋:
typedef float realType
oznacza to, 偶e mo偶na teraz wymiennie u偶ywa膰 float i realType
Zastosowania
Wprowadzenie w艂asnej nazwy czyni program 艂atwiejszym do modyfikacji. Za艂贸偶my, 偶e w programie dzia艂ania na liczbach rzeczywistych zaprogramowano z u偶yciem typu float. Podczas u偶ytkowania programu stwierdzono, 偶e wymagana jest wi臋ksza precyzja i potrzebny jest typ double. Oznacza to, 偶e trzeba wszystkie wyst膮pienia zmiennych typu float nale偶y zamieni膰 na double. Zmiany te mo偶na upro艣ci膰, je艣li u偶yto by instrukcji typedef. Na przyk艂ad:
#include <iostream.h>
int main()
{
typedef float real; // real jest synonimem float
const real PI=3.14159;
real promien;
cout << "Wpisz promien:";
cin >> promien;
real obwod=2*PI*promien;
cout << "Obwod=" << obwod << endl;
return 0;
}
Zmiana typu zmiennych u偶ywanych do oblicze艅 sprowadzi si臋 do wymiany instrukcji
typedef float real
na:
typedef double real;
Nowa nazwa mo偶e by膰 wygodnym skr贸tem dla okre艣lenia typu o d艂ugiej nazwie:
typedef unsigned char uchar;
Odt膮d zamiast unsigned char mo偶na pisa膰 uchar.
Standardowe biblioteki C++ bardzo cz臋sto korzystaj膮 z tej techniki w przypadku deklaracji, kt贸re zale偶膮 od systemu. 艁atwiej jest wtedy przenosi膰 oprogramowania mi臋dzy r贸偶nymi komputerami.
Przyk艂ad:
Za艂贸偶my, 偶e w聽pewnych zastosowaniach sieciowych potrzebujemy pos艂ugiwa膰 si臋 liczbami umieszczonymi na 32 bitach (przyk艂adem jest adres IP). Mogliby艣my skorzysta膰 z typu unsigned int, ale typ int mo偶e zajmowa膰 2聽(czyli 16 bit贸w) lub 4 bajty (32 bity) w zale偶no艣ci od komputera. Chcemy napisa膰 program, kt贸ry 艂atwo b臋dzie mo偶na przenosi膰. Za艂贸偶my, 偶e nasz komputer przeznacza na typ unsigned int 32 bity. Mo偶emy zatem zdefiniowa膰 typ o nazwie uint32 jako:
typedef unsigned int uint32
Tym typem b臋dziemy si臋 pos艂ugiwa膰 wsz臋dzie tam, gdzie b臋dziemy definiowali zmienne wymagaj膮ce 32聽bit贸w. Je艣li teraz program zostanie przeniesiony na komputer, na kt贸rym unsigned int zajmuje 2聽bajty, za艣 unsigned long int zajmuje 4 bajty, wystarczy w odpowiednim pliku nag艂贸wkowym zmieni膰 jedn膮 definicj臋:
typedef unsigned long int uint32
10
Bo偶ena 艁opuch
Podstawy programowania
Materia艂y do wyk艂ad贸w
(2001)
sta艂a
zmienna
Typy danych w C++
Typ niezdefiniowany void
Typy proste
Typy z艂o偶one
Typy ca艂kowite
Typy rzeczywiste
Arytmetyczne
Wska藕niki
Typ wyliczeniowy
Typ logiczny
Referencje
Pole zacienione:
tych typ贸w
nie ma w C
char (znakowy)
int (ca艂kowity)
float (zmiennopozycyjny pojedynczej precyzji)
double (zmiennopozycyjny podw贸jnej precyzji)
Typ podstawowy
Kwalifikatory
signed
(ze znakiem)
unsigned
(bez znaku)
short
(kr贸tki)
long
(d艂ugi)