C++'ens Datatyper
ForordI C++ klassificeres alle data efter deres type. Type begrebet betyder, at programmøren kan relatere data med andre data. At arbejde med datatyper er i grunden et spørgsmål om, hvordan et bestemt mønster skal fortolkes i en sammenhæng. For når det kommer til stykket, er computerens lager organiseret i lineært adresserede bits, nuller eller ettaller.På generelle computere er lageret normalt organiseret i bytes, som er det mindste antal bits, som kan adresseres på samme tid samt i maskin-ord. Det var lidt, hmm teori i introen. Håber det var nemt nok, anyway læs det igen hvis du ikke fik det helt med. Symbolske variableEt objekt og en variabel har stort set samme mening i OOP. Den forskel der er, at en variabel henviser til en syntaksmæssig størrelse i kildekoden, mens et objekt betyder at en forkomst af en bestemt typr. Variable repræsenteres som symboler. En C++-variabel har et unikt navn, og skal erklæres som en variabel af en bestemt type, før den kan bruges. Erklæringen af en variabel v med en type T fortages ved:
Hvorefter v kan opfattes som en abstraktion af typen T, der gælder et sæt regler for bla. ind- og udlæsning, generel manipulation og oprettelse. v er en symbolsk variabel dvs. en syntaksmæssig abstraktion, som lader os arbejde med et navn, som giver os hvad variablen repræsentere med et navn (hermed v). Denne abstraktion tabes med det samme i målkoden, fordi det færdigoversatte program ikke bibeholder symbolikken. Den er kun til gavn for udvikleren, som kan døbe en variabel et navn, som har forbindelse med den indhold. Fx vil et godt navn til en variabel, som beskriver en temperatur være temp. Der er altså en forskel på de to former for abstraktion, som typesystemer giver udvikleren: den ene giver hardware uafhængighed, den anden giver syntaksfrihed. Tildelinger af variabler fortages således:
Hvilket tilteler variablen heltal værdien 5. Der er tale om to klasser af udtryk i tildelinger, nemlig udtryk til venstre for lighedstegnet (en lvalue) or udtryk til højre for (en rvalue). Bentre-udtrykket skal være en endelig "adresse", hvor en værdi kan placeres, mens højre-udtrykket skal resultere i en håndgribelig værdi. Det er fx ikke muligt at skrive
Til gengæld kan en højre-værdi godt eksistere på begge sider af lighedstegnet. Derudover kan begge slags udtryk være en kombination af subudtryk, opdelt af operatorer. Operatorer bruges til samling af variable. Et sammensat udtryk kan se således ud:
Hvor hojde og bredde gennem en multiplikation resultere i en højre-værdi. Venstre-værdier kan også bestå af sammensatte udtryk. En tildeling kan forekomme på samme tid som en erklæring. Erklæringen og tildelingen:
Kan skrives kortere som
Paranteser bruges i komplekse udtryk til at underkende de indbyggede regler mellem fx additions- og multiplikationssubudtry, som i:
Hvilket tildeler a produktet af addition mellem 5 og 3 samt 4, altså 32. Skrives:
vil den indbyggede precedens gange 3 med 4 også addere 5 med resultatet 17. Konstanter, der udgør del af højreudtrykket, kan specificeres som en speciel type:
I C++ (og C for den sags skyld) er syntaksten meget generel, og tillader placering af tildelinger og erklæringer næsten overalt. Dette leder i nogle tilfælde til sætninger, hvor meningen kan gå tabt for en hurtig læser i udtrykket:
Tildeles både a og b summen af c og d. Syntaksen bruges, når flere variable skal tildeles eller initieres med samme værdi. Paranteser kan benyttes i flerdelte tildelinger, hvorved de enkelte elementer tildeles værdien indenfor den parantes de står . I udtrykket:
tildeles a summen af c og d, mens b tildeles værdien af c alene, grundet paranteserne. Komma, har en vigtig betydning i C++, idet det bruges til at sekvensere udtryk. To eller flere erklæringer og/eller tildelinger kan samles i en enkelt særning, separeret af kommaer:
KonstanterKonstante værdier er data, som står eksplicit beskrevet i kildekoden. C++ har tre typer af konstanter: heltal, kommatal og karakterer. Det er muligt at specificere disse tre typer på forskellige syntaksbestemte måder samt i forskellige talsystemer. Den oftest benyttede konstant er heltalle, som er uundværlig i næsten alle kontrolstrukturer:
Decimale konstanter er underforstået for heltal, og andre heltal må bruge en anden syntaks. Det ses, at hexadecimale konstanter har en 0x før selve konstanten, at oktale konstanter altid starter med et 0, samt at karakter-konstanter benytter sig af karakteren omsluttet af apostrofer. Der skelnes ikke mellem store og små bogstaver i hexadecimale heltats-konstanter. Karakter-konstanter bruges til at findeværdien af et bestemt tegn i det aktuelle tegnsæt, hvilket oftest hedder ASCII. Størrelsen på heltallet - altså om det er en short eller long - afgøres af variablen i tildelingen. Oversætteren regner med en short, men kan tvinges til at bruge en long ved at klistre et L efter heltals-konstanten:
Dette gælder også kommatal. Oversætteren forudsætter altid den mindste præcision, når en konstant lagres, men det er muligt at tvinge den til at gemme en float-konstant med:
Læg mærke til, at der ikke skelnes mellem float og double, når det gælder konstanter. Syntaksten er i øvrigt sjældent nødvendig, og bruges kun i forbindelse med specielle funktionskald og initieringer af datastrukturer. Det er et spørgsmål om at fortælle oversætteren, at en bestemt konstant ikke behøver mere præcision end man har behov for, så den ikke allokerer unødvendigt plads og bruger unødvendig RAM til konvertering. Oversætteren vil ivrigt advare om brugen af konstanter, der er for store i forhold til konteksten. Kommatal, som har typen double eller float, kan skrives som konstanter i enten normal eller videnskablisgform:
For at undgår tvetydigheder mellem kommatal og fx heltaltskonstanter i situationer, hvor oversætteren skal have den korrekte type som konstant, efterfølges af tallet af et komma og et eventuelt nul:
Som beskrevet kan karakterkonstanter specificeres med omslutning af apostrofer. Selvom C++ har datatypen char, definerer sproget ikke, hvordan karaktersættet ser ud. Det er altså ingen konvention, om hvilke værdier de forskellige tegn (bogstaver, symboler etc.) har på target-maskinen. De fleste OS (UNIX, MS-DOS) bruger dog ASCII karaktersættet og standardbiblioteket i C++ har derfor visse ASCII-relaterede funktioner. Men selve sproget definerer kun typen char som et heltal af tilstrækkelig båndbredde til at kunne rumme et tegn. Et 'a' vil have en anden numerisk værdi på en ASCII-maskine end på fx. en EBCDIC-maskine. For at sikre flytbarheden mest muligt kan karakterkonstanter indeholde et antal maskinuafhængige kontroltegn, fx linieskift og tabulatorfunktion. Kontrolregn specificeres med en escape-karatkter, den bagvendte skråstreg \
De faktiske regn \, ' og " skrives som karakterkonstant således:
Det er også muligt at specificere en numerisk karakterkonstant vha. escape-tegnet. Kun 8- og 16-talssystemet kan bruges i escape-sekvenser i karakterkonstanter:
Strenge som vi kender dem fra andre sprog, er meget begrænset i C++. Strenget er ikke en datatype i sig selv, men er repræ. som en lineær list af char's, som slutter med '\0', og kan ikke manipuleres direkte af C++. Standardbiblioteket indeholder derfor en række funktioner, som arbejder med strenge. Det er vigtigt at huske, at en lovlig C++-streng altid slutter i '\0', og at denne terminator tælles med i lagerallokeringen derfor har strengen:
en faktisk længde på 14 [l]char[/i]'s. Kontroltegn kan indsættes i streng konstanter efter samme regler for karakterkonstanter:
Bemærk at 'a' ikke er ækvivalent til "a", idet sidstnævnte er en konstant på to chars, 'a' og '\0'. Hvis en variabel i C++ aldrig modificeres gennem hele programmet, kan /og bør) den erklæres som const. Velogmærket med nøgleordet const:
En const skal altid initieres ved erklæringen. Konstanter er brugbare i de tilfælde, hvor kildekoden skal kunne oversættes med forskellige indbyggede afhængigheder. Fx kunne en konst. i kildekoden specificere antallet af brugere i et flerbrugersystem, som sælges i forksallige licens-konfigurationer. Eller fx værdierne af forskellige tegn.
Læg mærke til at en int ikke er det samme som en const int. Overvej følgende kode:
Dette skyldes, at det ikke er muligt at tage adressen på en konstant type, hverken implicit eller eksplicit (ved tildeling eller ved brug af operator). Det faktum, at konst. typer er forskllige fra variable typer har sin største betydning i forbindelse med funktioner og interaktion med abstrakte datatyper. Det er ren matematik! Enjoy! Sidst redigeret 23:43 23/12/2010 |
|
Kommentarer
Giv din mening tilkende om denne artikel, eller læs andres.Har du spørgsmål eller brug for hjælp til denne artikel henvises du til forummet.
| Hvilke tastefejl? Nu har jeg ikke hmm.. proofreaded, den.. Men, kan du give nogle eks. så jeg evt. kan rette? |
Oprettet af:
|
| ja du må meget gerne komme med nogle eks. :D |
Oprettet af:
|
