熊猫血有什么好处
U ra?unarstvu i ra?unalnom programiranju tip podatka svojstvo je podatka (?esto varijabli) koje kompilatoru ili interpreteru pru?a informaciju o tome ?to ?e se s navedenim podatkom raditi, kakve ?e operacije biti dopu?teno vr?iti nad podatkom, na koji ?e se na?in podatak spremati i ?to podatak predstavlja.
Tipovi podataka dijele se na primitivne i slo?ene.
Primitivni su tipovi podataka oni koje programski jezik zadano podr?ava. U ve?ini jezika takvi se tipovi ne mogu pro?irivati ni redefinirati, a njihovi se operatori ne mogu preoptere?ivati.
Klasi?ni primitivni tipovi podatka obi?no su:
- boolean - sadr?i vrijednost ra?unalne to?nosti ili pogre?nosti (obi?no bitovi 1 ili 0)
- cijeli broj (integer) - sadr?i brojeve bez decimala obi?no unutar vrijednosnih ograni?enja
- decimalni broj s pomi?nom to?kom (float) - sadr?i decimalni broj jednostruke preciznosti koji obi?no ima stalan broj ukupnih znamenki
- znak - sadr?i jedan grafem ili simbol
- string - sadr?i niz znakova, obi?no ograni?en maks. duljinom ili znakom \0
Primitivni tipovi podataka mogu uklju?ivati i slo?ene (kompozitne) tipove za koje jezik zadano pru?a podr?ku. Kao primjer, C ne poznaje tip podatka string, i nema definirane operacije sa stringovima.[1] C# pru?a ugra?enu podr?ku za tip string, no sam tip je definiran kao kompozitni tip sastavljen od niza znakova (tip char).[2] JavaScript zadano podr?ava tip string i operacije sa stringovima, i smatra stringove primitivnim tipom podatka.[3]
Tip podatka boolean ili bool je logi?ki tip koji obi?no sadr?i vrijednosti true ili false (obi?no predstavljen broj?anim zapisom 1 ili 0, respektivno). Iako je za zapis boolean vrijednosti dovoljan jedan bit memorije, neki programski jezici koriste vi?e od toga.[4] Npr. u JavaScriptu, boolean ?esto zauzima 4 bajta na 32-bitnim platformama, i 8 bajtova na 64-bitnim platformama, zbog na?ina alokacije memorije na takvim sustavima.[5]
Neki jezici tako?er dopu?taju implicitno pretvaranje boolean tipa u cijeli broj. Rane implementacije jezika C nisu imale zasebno definiran tip boolean, ve? se broj?ana vrijednost 0 uzimala kao logi?ka la? (false), a bilo koja druga broj?ana vrijednost kao logi?ka istina (true).[6] Standard jezika C imena C99 uvodi boolean kao zaseban tip podatka i dio biblioteke stdbool.h.[7] Jezik C++ podr?ava bool
kao ugra?eni tip podatka, a rije?i "true" i "false" su rezervirane i mogu se koristiti samo u te svrhe.[8]
Svaki numeri?ki tip podatka ima definiranu gornju i donju vrijednosnu granicu, odnosno raspon brojeva koje mo?e prikazati. Spremanje ili prikaz brojeva van tog raspona mo?e dovesti do pogre?ke pri kompilaciji, ili do neispravnog spremanja ili obrade podatka, ovisno o programskome jeziku. Vrijednosna granica je obi?no odre?ena veli?inom memorije koja je odvojena za spremanje tog tipa podatka (obi?no je gornja granica 2n gdje je n broj bitova kori?ten za spremanje tog podatka). Neki jezici tako?er rezerviraju jedan bit za predznak broja, ?to smanjuje raspon vrijednosti takvog tipa podatka. Decimalni tipovi podataka uvelike se razlikuju u na?inu spremanja vrijednosti i preciznosti istih, koje naj?e??e ovise o definiciji samog programskog jezika.
Ni?e je primjer brojevnih tipova i njihovih raspona u jeziku C++:
Tip podataka | Vrsta | Predznak | Duljina (broj bajtova)[9] | Opseg[9] | |
---|---|---|---|---|---|
1 | int | short | signed | 2 | -32.768 do 32.767 |
unsigned | 2 | 0 do 65.535 | |||
long | signed | 4 | –2.147.483.648 do 2.147.483.647 | ||
unsigned | 4 | 0 do 4.294.967.295 | |||
long long | signed | 8 | –9.223.372.036.854.775.808 do 9.223.372.036.854.775.807 | ||
unsigned | 8 | 0 do 18.446.744.073.709.551.615 | |||
2 | float | 4 | -3.4·10?38 do 3.4·1038 | ||
3 | double | 8 | -1.7·10?308 do 1.7·10308 |
Znak (char) je tip podatka koji mo?e sadr?avati jedno slovo, broj, simbol, interpunkcijski znak, kontrolni znak ili kakav drugi specijalizirani znak. Jezik C definira znak kao najmanji dodjeljivi dio memorije, obi?no veli?ine 8 bitova (1 bajt). Neki jezici imaju dodatnu podjelu znakova po veli?ini bajtova koje zauzimaju: jednobajtni tipovi prihva?aju sve znakove u ASCII tablici, dok dvobajtni tipovi prihva?aju sve Unicode znakove. Neki jezici visoke razine (Python, Ruby) nemaju zaseban tip podatka za char, ve? koriste stringove veli?ine 1.[10][11]
Znak mo?e sadr?avati broj, no znak ne?e imati istu numeri?ku vrijednost kao broj. Numeri?ka vrijednost broja 5 je 5, dok je numeri?ka vrijednost znaka "5" jednaka broju 53 (jer je znak za broj 5 u ASCII tablici 53. po redu). Operacija "5"+5
(nakon implicitne pretvorbe znaka "5" u broj 53) vratit ?e rezultat 58. Ovakva je pretvorba tipova podataka (cast) u jezicima poput C-a prihvatljiva, dok ?e u drugima izazvati pogre?ku.
JavaScript ovakve konverzije prihva?a, ali rezultat operacija su ponekad neo?ekivani:
> 2+2
4
>"2" + "2"
22
>2+2-2
2
>"2"+"2"-"2"
20
>("2"+"2")-"2"
20
>"2"+("2"-"2")
20
Vi?e slijednih znakova ?ini string. Stringovi se obi?no koriste kao podatkovna reprezentacija rije?i ili teksta. Programski jezici koji nemaju podr?ku za stringove, umjesto istih koriste nizove (polja) znakova. Takva su polja ?esto imutabilna. Stringovi se ?esto delimitiraju navodnicima ili jednostrukim apostrofima.
Stringovi tako?er mogu sadr?avati brojeve (?ime ?ine broj?ani string, npr. "1234"
), no takvi stringovi nisu jednaki broju koji string predstavlja, a matemati?ke operacije izme?u broj?anih stringova i brojeva (npr. "12"+28
) izazvat ?e pogre?ku (ne?e do?i do implicitne pretvorbe tipova podataka).
Me?u programskim jezicima postoje razlike u implementaciji i obradi stringova. Najjednostavniji na?in je stvaranje niza (polja) znakova (ponekad ograni?enih fiksnom veli?inom), i ozna?avanje kraja stringa posebnim delimiterom, ?esto znakom znakom NUL (\0
). Ovakav se string naziva "null-terminated string", ponegdje i C string (ovakav na?in rada koristi jezik C). Problem s ovakvom implementacijom javlja se ako string prekora?i veli?inu svog spremnika (ako je isti fiksne veli?ine):
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
o | v | o | j | e | s | t | r | i | n | g | ! | ! | ! | \0 | ||
o | v | o | j | e | v | e | ? | i | s | t | r | i | n |
Ako se dogodi prekora?enje veli?ine (buffer overflow), program ?e nastaviti ?itati susjednu memoriju dok ne nai?e na znak \0
, ?to mo?e dovesti do pogre?aka u radu, naro?ito ako program poku?a pristupiti memoriji koju nema pravo ?itati. Operacijski sustav takve programe mo?e sru?iti kao mjeru prevencije ?tete.
Neki programski jezici (C++ i Java) koriste \0
za kraj stringova, no unutar standardnih biblioteka imaju definirane zasebne klase za obradu i spremanje stringova koji sprje?avaju problem prekora?enja veli?ine (obi?no alokacijom dodatne memorije po potrebi). C++ za tu svrhu koristi klasu std::string
, dok Java koristi Java.lang.String
.
Me?u jezicima tako?er postoji razlika u mogu?nosti naknadne promjene sadr?aja varijabli tipa string. Stringovi kojima nije mogu?e promijeniti veli?inu ni sadr?aj zovu se imutabilni (immutable). Za promjenu sadr?aja imutabilnog stringa potrebno je direktno mijenjati ra?unalnu memoriju (npr. C funkcijom memcpy, pri ?emu treba iznimno paziti na problem prekora?enja veli?ine i prepisivanja susjedne memorije ako je novi string ve?i od spremnika). Sigurniji na?in rada s imutabilnim stringovima je deklaracija nove varijable ili objekta koji sadr?i vrijednost novog stringa. Jezici poput JavaScripta,[12] Lue[13] i Pythona[14] koriste konstante (imutabilne) stringove. Promjenjive stringove koriste npr. C++,[15] Perl[16] i Ruby.[17]
Pokaziva? ili referenca je tip objekta koji sprema memorijsku adresu neke varijable, konstante ili objekta. U proceduralnom programiranju, pokaziva?i spremaju podatak o to?ki ulaska u potprogram. Tako?er se koriste za povezivanje programa i vanjskih resursa, poput DLL biblioteka (tad se nazivaju handle). Pokaziva?i dopu?taju ?itanje i promjenu varijable na koju pokazuju. Dodjela memorijske adrese pokaziva?u naziva se referenciranje. Pristup ili promjena vrijednosti varijable na dodijeljenoj adresi naziva se dereferenciranje.
Neki programski jezici podr?avaju vi?e razli?itih tipova pokaziva?a. C++ u sklopu biblioteke memory pru?a pristup razli?itim tipovima tzv. pametnih pokaziva?a, originalno osmi?ljenim kao zamjena za garbage collector kojim jezici poput C# i Jave automatski upravljaju memorijom i objektima. C++ podr?ava:
- auto_ptr: svaki pametni pokaziva? tog tipa isklju?ivi je vlasnik jednog dinami?ki alociranog objekta. Drugi pokaziva? ovog tipa referenciran na isti objekt semantikom kopiranja (pozivom kopirnog konstruktora) preuzima vlasni?tvo nad objektom, ?ime prvi pokaziva? postaje nedefiniran (pokazuje na memorijsku lokaciju na kojoj se objekt vi?e ne nalazi). Uvo?enjem unique_ptr, ovaj tip pokaziva?a ulazi u zastaru i nije ga preporu?ljivo koristiti.[18]
- unique_ptr: dopu?ta preuzimanje vlasni?tva nad objektom samo pomo?u semantike prijenosa (pozivom prijenosnog konstruktora), ?ime se prvi pokaziva? automatski postavlja na vrijednost
NULL
, ?to sprje?ava nedefinirana pona?anja.[19] - shared_ptr: stvaranjem ovog tipa pokaziva?a stvara se kontrolni objekt koji automatski prati koliko drugih shared_ptr i weak_ptr pokaziva?a koristi alocirani objekt. Nakon ?to svi shared_ptr pokaziva?i prestanu pokazivati na objekt, objekt se dealocira iz memorije (uni?tava). Kontrolni objekt postoji dok god postoji weak_ptr koji pokazuje na objekt (neovisno postoji li objekt ili je uni?ten). Kontrolni se objekt uni?tava tek kad broja? weak_ptr pokaziva?a padne na nulu.[20]
- weak_ptr: ovaj tip pokaziva?a dopu?ta uni?tavanje objekta iako postoje pokaziva?i na njega. Koristi se za sprje?avanje kru?nih ovisnosti objekata (A->B->C->A).[21]
U novijim programskim jezicima koji te?e modelu univerzalne obrade podataka, funkcije je mogu?e proslijediti kao argumente drugim funkcijama (jezici koji to podr?avaju ka?emo da podr?avaju funkcije prve klase). Klasi?no se samo podatci mogu slati kao argumenti funkcijama, pa je u svrhe facilitacije prvoklasnih funkcija uveden funkcijski tip podatka koji omogu?ava ovakve interakcije.
Ni?e je dan prikaz sintakse funkcijskog tipa nekolicine programskih jezika, uz primjer deklaracije funkcije koja omogu?uje matemati?ku kompoziciju: f(g(x)), gdje se rezultat funkcije g uzima kao argument pri izra?unu funkcije f. Parametarski polimorfizam vrsta je ad-hoc polimorfizma, ?to je osnova generi?kog programiranja, koje omogu?ava pisanje tzv. funkcijskih predlo?aka koje jednako rade neovisno o tipu podatka koji prime.
Jezik | Zapis | Funkcijski potpis (deklaracija) | |
---|---|---|---|
S prvoklasnim funkcijama i
parametarskim polimorfizmom |
C# | Func<α1,α2,...,αn,ρ>
|
Func<A,C> compose(Func<B,C> f, Func<A,B> g);
|
Haskell | α -> ρ
|
compose :: (b -> c) -> (a -> b) -> a -> c
| |
OCaml | α -> ρ
|
compose : ('b -> 'c) -> ('a -> 'b) -> 'a -> 'c
| |
Scala | (α1,α2,...,αn) => ρ
|
def compose[A, B, C](f: B => C, g: A => B): A => C
| |
Standard ML | α -> ρ
|
compose : ('b -> 'c) -> ('a -> 'b) -> 'a -> 'c
| |
Swift | α -> ρ
|
func compose<A,B,C>(f: B -> C, g: A -> B) -> A -> C
| |
Rust | fn(α1,α2,...,αn) -> ρ
|
fn compose<A, B, C>(f: fn(A) -> B, g: fn(B) -> C) -> fn(A) -> C
| |
S prvoklasnim funkcijama, bez
parametarskog polimorfizma |
Go | func(α1,α2,...,αn) ρ
|
var compose func(func(int)int, func(int)int) func(int)int
|
C++, Objective-C,
s blokovima |
ρ (^)(α1,α2,...,αn)
|
int (^compose(int (^f)(int), int (^g)(int)))(int);
| |
Bez prvoklasnih funkcija
i parametarskog polimorfizma |
C | ρ (*)(α1,α2,...,αn)
|
int (*compose(int (*f)(int), int (*g)(int)))(int);
|
C++11 | Nije jedinstven
|
function<function<int(int)>(function<int(int)>, function<int(int)>)> compose;
|
Ako gledamo potpis funkcije u npr. jeziku C#, tip funkcije compose
je zapravo Func<Func<A,B>,Func<B,C>,Func<A,C>>
.
Nulabilni tipovi mogu?nost su nekih programskih jezika koji dopu?taju da se vrijednost neke varijable postavi na posebnu vrijednost NULL umjesto dozvoljenih vrijednosti toga podatkovnog tipa. Vrijednost NULL obi?no predstavlja vrijednost koja nedostaje ili je neispravna (primjerice izvan o?ekivanog raspona). U odre?enim jezicima, primjerice C#, primitivni tipovi podataka obi?no ne mogu poprimiti NULL vrijednost, ali pripadaju?i nulabilni tip (primjerice Nullable Integer - int?
) mo?e. Znak ? nakon deklaracije tipa podatka ?ini tip nulabilnim, odnosno sposobnim poprimiti vrijednost NULL.
Varijabla tipa Boolean mo?e imati vrijednost istina ili la?, dok nulabilni Boolean dodaje i mogu?nost predod?be neodlu?ene ili nedefinirane vrijednosti.
Pokaziva?i i reference smiju se uvijek postaviti na vrijednost NULL neovisno o tipu, ?to ozna?ava da referenca ne vodi nikamo, nema dodijeljenu memorijsku adresu i nije vezana uz objekt.
Poku?aj izvo?enja matemati?kih i logi?kih operacija nad varijablama koje su postavljene na NULL rezultirat ?e pogre?kom te izbacivanjem iznimke (obi?no vrste InvalidOperation) ili padom programa.
Poku?aj dereferenciranja pokaziva?a ili pristupanje vrijednostima ili svojstvima varijable ili objekta koji su postavljeni na NULL rezultirat ?e padom programa zbog poku?aja pristupa nedozvoljenoj ili nepostoje?oj memoriji (segmentacijska pogre?ka).[22] Neki jezici, poput Jave, Lispa ili C# koriste sakupljanje sme?a, ?to ?e izbje?i direktnu segmentacijsku pogre?ku[23] ali ?e baciti iznimku klasnog tipa NullPointerException koja mo?e dovesti do pada programa. Jezik C++ podr?ava eksplicitno bacanje ru?no stvorenih iznimki, no poku?aj pristupa NULL vrijednosti smatra se neodre?enim pona?anjem[24], pa ?e program pasti bez iznimke.
- ↑ Data Types in C. GeeksforGeeks (engleski). 30. lipnja 2015. Ina?ica izvorne stranice arhivirana 20. prosinca 2020. Pristupljeno 31. prosinca 2020.
- ↑ dotnet-bot. String Class (System). docs.microsoft.com (engleski). Ina?ica izvorne stranice arhivirana 9. o?ujka 2021. Pristupljeno 31. prosinca 2020.
- ↑ String - JavaScript | MDN. developer.mozilla.org. Ina?ica izvorne stranice arhivirana 4. sije?nja 2021. Pristupljeno 31. prosinca 2020.
- ↑ [expr.sizeof]. eel.is. Ina?ica izvorne stranice arhivirana 15. sije?nja 2021. Pristupljeno 31. prosinca 2020.
- ↑ Memory size of Javascript Boolean. DEV Community (engleski). Ina?ica izvorne stranice arhivirana 9. o?ujka 2021. Pristupljeno 31. prosinca 2020.
- ↑ Brian W. Kernighan, Dennis M. Ritchie. str. 41.. The C Programming Language. prvo izdanje izdanje. Prentice Hall. Englewood Cliffs, New Jersey. ISBN 0-13-110163-3
- ↑ Boolean type support library. devdocs.io. Ina?ica izvorne stranice arhivirana 2. velja?e 2019. Pristupljeno 15. listopada 2020.
- ↑ Bool data type in C++. GeeksforGeeks. Ina?ica izvorne stranice arhivirana 18. rujna 2020. Pristupljeno 15. listopada 2020.
- ↑ a b corob-msft. Data Type Ranges. docs.microsoft.com (engleski). Ina?ica izvorne stranice arhivirana 9. o?ujka 2021. Pristupljeno 31. prosinca 2020.
- ↑ Python Strings. w3schools.com. Ina?ica izvorne stranice arhivirana 2. sije?nja 2021. Pristupljeno 1. sije?nja 2021.
- ↑ Class: String (Ruby 2.5.3). ruby-doc.org. Ina?ica izvorne stranice arhivirana 12. studenoga 2020. Pristupljeno 1. sije?nja 2021.
- ↑ Immutability in JavaScript - SitePoint. sitepoint.com (engleski). Ina?ica izvorne stranice arhivirana 24. sije?nja 2021. Pristupljeno 1. sije?nja 2021.
- ↑ Programming in Lua : 2.4. lua.org. Ina?ica izvorne stranice arhivirana 2. velja?e 2021. Pristupljeno 1. sije?nja 2021.
- ↑ Leung, Wendy. 9. lipnja 2019. Mutability and Immutability in Python — Let’s Break It Down. Medium (engleski). Ina?ica izvorne stranice arhivirana 28. svibnja 2020. Pristupljeno 1. sije?nja 2021.
- ↑ Lemire, Author Daniel. Are your strings immutable?. Daniel Lemire's blog (engleski). Ina?ica izvorne stranice arhivirana 28. velja?e 2021. Pristupljeno 1. sije?nja 2021.
- ↑ Are Perl strings immutable?. Stack Overflow. Ina?ica izvorne stranice arhivirana 29. srpnja 2015. Pristupljeno 1. sije?nja 2021.
- ↑ Understanding Mutable Objects & Frozen Strings. RubyGuides (engleski). 3. sije?nja 2016. Ina?ica izvorne stranice arhivirana 2. prosinca 2020. Pristupljeno 1. sije?nja 2021.
- ↑ std::auto_ptr - cppreference.com. en.cppreference.com. Ina?ica izvorne stranice arhivirana 10. travnja 2021. Pristupljeno 1. sije?nja 2021.
- ↑ std::unique_ptr - cppreference.com. en.cppreference.com. Ina?ica izvorne stranice arhivirana 12. studenoga 2020. Pristupljeno 1. sije?nja 2021.
- ↑ std::shared_ptr - cppreference.com. en.cppreference.com. Ina?ica izvorne stranice arhivirana 28. prosinca 2020. Pristupljeno 1. sije?nja 2021.
- ↑ std::weak_ptr - cppreference.com. en.cppreference.com. Ina?ica izvorne stranice arhivirana 16. sije?nja 2021. Pristupljeno 1. sije?nja 2021.
- ↑ Debugging Segmentation Faults and Pointer Problems - Cprogramming.com. www.cprogramming.com. Ina?ica izvorne stranice arhivirana 10. srpnja 2022. Pristupljeno 14. o?ujka 2022.
- ↑ Dhurjati, Dinakar; Kowshik, Sumant; Adve, Vikram; Lattner, Chris. 2003. Memory safety without runtime checks or garbage collection. Proceedings of the 2003 ACM SIGPLAN conference on Language, compiler, and tool for embedded systems - LCTES '03 (engleski). ACM Press. San Diego, California, USA. : 69. doi:10.1145/780732.780743. ISBN 978-1-58113-647-0. Ina?ica izvorne stranice arhivirana 16. svibnja 2022. Pristupljeno 14. o?ujka 2022.
- ↑ Undefined behavior - cppreference.com. en.cppreference.com. Ina?ica izvorne stranice arhivirana 1. travnja 2022. Pristupljeno 14. o?ujka 2022..
undefined behavior - [...], null pointer dereference, [...]
![]() | Zajedni?ki poslu?itelj ima jo? gradiva o temi tip podatka (ra?unarstvo) |