Thema indholdsfortegnelse -- Tastaturgenvej: 'u'  Forrige tema i denne lektion -- Tastaturgenvej: 'p'  Næste slide i denne lektion -- Tastaturgenvej: 'n'Datatyper
17.  Typer

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 Typer17.2 Typer 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.

En type er en mængde af værdier med fælles egenskaber

Der er følgende tre gode årsager til at skrive programmer i programmeringssprog, som understøtter typer.

  • Typer forbedrer programmets læsbarhed og forståelighed

  • Typer gør det muligt for compileren at generere bedre og mere effektiv kode

  • Typer gør det muligt at opdage fejl i programmet - typisk under oversættelsen

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;
}
Program 17.1    Et C program med typer.

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
Program 17.2    Output fra ovenstående program.

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

  • Eksempler på løshed i C's typesystem:

    • Typen boolean er indlejret i de numeriske typer

    • Typen char er reelt et heltalsinterval

    • Enumeration typer er reelt heltalstyper

      • Vi møder enumeration typer senere i denne lektion

    • De fleste numeriske typer kan implicit konverteres til hinanden

Det traditionelle C sprog har en endnu mere løs omgang med typer end ANSI C

Genereret: Onsdag 7. Juli 2010, 15:11:28
Thema indholdsfortegnelse -- Tastaturgenvej: 'u'  Forrige tema i denne lektion -- Tastaturgenvej: 'p'  Næste slide i denne lektion -- Tastaturgenvej: 'n'