Thema indholdsfortegnelse -- Tastaturgenvej: 'u'  Forrige tema i denne lektion -- Tastaturgenvej: 'p'  Næste slide i denne lektion -- Tastaturgenvej: 'n'Introduktion til programmering i C
2.  Udtryk og operatorer

Et imperativt program er bygget op af erklæringer, kommandoer og udtryk. Et funktionsorienteret program (ala et ML program) er har ingen kommandoer. I dette afsnit ser vi på udtryk i C.

2.1 Udtryk2.4 Associering af operatorer
2.2 Beregning af sammensatte udtryk2.5 Operator tabel for C
2.3 Prioritering af operatorer
 

2.1.  Udtryk
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Et udtryk er et stykke program, som vi kan beregne med henblik på at producere en værdi. Denne værdi kan vi 'se på', gemme i en variabel, eller lade indgå i beregning af andre udtryk.

Udtryk i C er dog lidt mere komplicerede end ovenstående udlægning lader ane. C udtryk og C kommandoer lapper ganske kraftigt ind over hinanden. Denne problematik vil blive diskuteret i afsnit 3.1.

Udtryk er sammen med kommandoer de vigtigste 'byggesten' i ethvert program

Et udtryk er et programfragment der beregnes med henblik på returnering af en værdi, som tilhører en bestemt type.

Et udtryk opbygges typisk af operatorer og operander.

Med efterfølgende antagelser vil vi i tabel 2.1 beregne en række udtryk (i venstre søjle). Udtrykkenes værdier vises i højre søjle. Typerne af udtrykkene vises i midten.

Antag at værdien af x er 14 og y er 3:

Udtryk Type Værdi
7 Heltal 7
x Heltal 14
x + 6 Heltal 20
x / 3 Heltal 4
x % 3 Heltal 2
x <= y Boolean false
x + y * 3 >= y % x - 5 Boolean true
Tabel 2.1    Forskellige udtryk med udtrykkenes typer og værdier.

Typerne af et udtryk, som det fremgår af tabellen, udledes fra de erklærede typer af indgående variable, fra typerne af de indgående konstanter, og ud fra de erklærede returtyper af operatorer og funktioner.

På de følgende sider vil vi studere hvordan vi beregner udtryk, som er sammensat af flere deludtryk

 

2.2.  Beregning af sammensatte udtryk
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Sammensatte udtryk er opbygget med brug af to eller flere operatorer. Det betyder, at det sammensatte udtryk kan beregnes på flere forskellige måder.

Problemstilling: Hvordan fortolkes udtryk som er sammensat af adskillige operatorer og operander?

Herunder giver vi to forskellige måder at håndtere beregningsrækkefølgen af sammensatte, og ofte komplicerede udtryk.

  • Indsæt parenteser som bestemmer beregningsrækkefølgen

    • x + y * 3 >= y % x - 5

    • (x + (y * 3)) >= ((y % x) - 5)

  • Benyt regler som definerer hvilke deludtryk (operander) der beregnes før andre

    • Multiplikation, division og modulus beregnes før addition og subtraktion

    • Addition og subtraktion beregnes før sammenligning

C prioriterer operatorer i 15 forskellige niveauer. Men det er også muligt - og ofte nødvendigt - at sætte parenteser omkring deludtryk

Det er altid muligt at sætte så mange parenteser, at beregningsrækkefølgen fastlægges. Som bekendt for de fleste beregnes udtryk med parenteser 'indefra og ud'. Sideordnede udtryk beregnes som regel fra venstre mod højre. Der findes programmeringssprog som beror på konsekvent,eksplicit parentessætning, nemlig sprog i Lisp familien. Det er dog en almindelig observation, at mange programmører ikke ønsker at sætte flere parenteser i udtryk end strengt nødvendigt. Dermed er scenen sat for prioritering af operatorer og associeringsregler. Dette ser vi på i det næste afsnit.

 

2.3.  Prioritering af operatorer
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Udtryk som involverer operatorer med høj prioritet beregnes før udtryk med operatorer, der har lav prioritet. I tabel 2.2 viser vi en simplificeret tabel med nogle af de mest almindelige operatorer i C. Lidt senere, i tabel 2.3 gengiver vi den fulde tabel.

Niveau Operatorer
14 +unary      -unary
13 *      /      %
12 +      -
10 <      <=      >      >=
9 ==      !=
5 &&
4 ||
Tabel 2.2    En operatorprioriteringstabel for udvalgte operatorer.

Af tabellen fremgår for eksempel at udtryk med multiplikative operatorer (altså *, /, og %) beregnes før udtryk med additive operatorer (+ og -).

 

2.4.  Associering af operatorer
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Problemstilling: Prioriteringstabellen fortæller ikke hvordan vi beregner udtryk med operatorer fra samme niveau

Vi ser nu på udtryk som anvender to eller flere operatorer med samme prioritet. Et simpelt eksempel på et sådant udtryk er 1-2-3. Der er to mulige fortolkninger: (1-2)-3 som giver -4 og 1-(2-3) som giver 2. Den første svarer til venstre associativitet, den sidste til højre associativitet. I C og de fleste andre programmeringssprog er - venstre associativ. Det betyder at 1-2-3 er lig med (1-2)-3 som igen er lig med -4.

Lad os nu se på et andet tilsvarende eksempel:

  • 10 - 1 - 9 / 3 / 2

    • Operator prioriteringen fortæller at divisionerne foretages før subtraktionerne

    • Associeringsreglerne fortæller at der sættes parenteser fra venstre mod højre

    • ((10 - 1) - ((9 / 3) / 2))

    • Resultatet er 8

Vi skriver et simpelt C program, program 2.1, som indeholder ovenstående udtryk. Vi viser også programmets output i program 2.2. Som forventet er res1 og res2 ens. res3 er resultatet af den højre associative fortolkning, og er som sådan forskellige fra res1 og res2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main(void) {

  int res1, res2, res3;

  res1 =  10 - 1 - 9 / 3 / 2;

  res2 =  ((10 - 1) - ((9 / 3) / 2));    
  /* left to right associativity */

  res3 =  (10 - (1 - (9 / (3 / 2))));   
  /* right to left associativity */

  printf("res1 = %d, res2 = %d, res3 = %d\n", res1, res2, res3);
  
  
  return 0;
}
Program 2.1    Et C program med udtrykket 10 - 1 - 9 / 3 / 2.

1
res1 = 8, res2 = 8, res3 = 18
Program 2.2    Output fra ovenstående program.

De fleste operatorer i C associerer fra venstre mod højre

 

2.5.  Operator tabel for C
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Niveau Operatorer Associativitet
16 ()      []      ->      .      ++postfix      --postfix left to right
15 ++prefix      --prefix      !      ~      sizeof(type)      +unary      -unary      &unary,prefix      *unary,prefix right to left
14 (type name) Cast right to left
13 *      /      % left to right
12 +      - left to right
11 <<      >> left to right
10 <      <=      >      >= left to right
9 ==      != left to right
8 & left to right
7 ^ left to right
6 | left to right
5 && left to right
4 || left to right
3 ?: right to left
2 =      +=      -=      *=      /=      >>=      <<=      &=      ^=      |= right to left
1 , left to right
Tabel 2.3    Den fulde operator prioriteringstabel for C.

C by Dissection side 611

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