![]() ![]() ![]() | Datatyper |
I lektionen, som starter med dette kapitel, studerer vi typer i C. Vi har allerede ved flere lejligheder set på typer. I denne lektion vil vi dog være mere systematiske end vi hidtil har været. Vi vil også møde flere nye ting, som har med typer at gøre i C.
|
17.1. Typer
Indhold Op Forrige Næste Slide Aggregerede slides Stikord Programindeks Opgaveindeks
Følgende definition fortæller i bund og grund, at en type er en mængde af værdier. Så simpelt er det faktisk.
|
Der er følgende tre gode årsager til at skrive programmer i programmeringssprog, som understøtter typer.
|
Nedenstående program er tænkt som illustration af det første og det sidste af disse punkter.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdlib.h> double f (double p1, int p2){ if (p2 == 0) return p1 * 2.0; else return p1 - p2; } int main(void){ int i = 1, j = 5; double d = 2.0, e = 6.0; printf("The first result is %lf\n", f(e-d, i+j)); printf("The second result is %lf\n", f(d-e, 0)); return 0; } | |||
|
Først læsbarhed: Vi kan se, at funktionen f altid vil få overført to tal, nemlig først en double (p1) og en int (p2). Vi kan også se at funktionen altid vil returnere en værdi i typen double. Denne information er nyttig, når vi skal læse og forstå funktionen f.
Alle udtryk har en type, som kan bestemmes allerede på det tidspunkt at programmet oversættes. I program program 17.1 er typen af e-d double, i+j er int, og typen af f(e-d, i+j) er double. Hvis ikke disse typer passer ind, det sted, hvor udtrykket er placeret, vil compileren udskrive en fejlbesked.
Hvis vi kalder f som f(i+j, e-d) har vi principielt en fejlsituation, idet typen af første parameter er et heltal (int), og typen af den anden er et reelt tal (double). Det er imidlertid således, at C compileren implicit konverterer i+j til en double, og e-d til en int. Disse implicitte konverteringer vil vi diskutere i afsnit 19.1.
Det skulle være let at verificere, at programmet ovenfor giver output, som det fremgår herunder.
1 2 | The first result is -2.000000 The second result is -8.000000 | |||
|
En type udgør en klassificering af data som fortæller compilereren hvordan programmøren ønsker at fortolke data |
Ud over den fortolkning, som typerne bidrager med, finder der yderlig en type fortolkning sted i C. I de to printf kald i program 17.1 fortæller konverterings tegnene %lf at værdien skal fortolkes som en 'long float', hvilket vil sige en double. Hvis vi i stedet skrev %i vil vi få udskrevet et helt andet (og et forkert) resultat, som fortolker bitmønstret i de udskrevne udtryks værdier som heltal.
17.2. Typer i C
Indhold Op Forrige Næste Slide Aggregerede slides Stikord Programindeks Opgaveindeks
Vi opdager ikke så mange typefejl på 'compile time' som vi kunne have ønsket os, når vi programmerer i C. C er meget villig til at omfortolke værdier fra én type til værdier i en anden type. Vi tænker på dette som løshed i typesystemet i C.
ANSI C har en relativ løs skelnen mellem værdier i forskellige typer |
|
Det traditionelle C sprog har en endnu mere løs omgang med typer end ANSI C |