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

Ifølge vore forklaringer i kapitel 1 dækker udtryk og kommandoer to forskellige begreber. Kommandoer (ala assignments) udføres for at ændre programmets tilstand (variablenes værdier). Udtryk beregnes for at frembringe en værdi.

I C er assignments operatorer, og dermed kan assignments indgå i udtryk.

3.1 Blandede udtryk og assignments i C3.3 Eksempel: increment og decrement operatorerne
3.2 Increment og decrement operatorerne3.4 Andre assignment operatorer
 

3.1.  Blandede udtryk og assignments i C
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Udtryk i C er urene i forhold til vores hidtidige forklaring af udtryk

Årsagen er at et assigment opfattes som et udtryk i C

Vi illustrerer problemstillingen konkret herunder.

  • Antag at i har værdien 7

  • Programfragmentet a = i + 5 er et udtryk i C

    • Udtrykket beregnes som a = (i + 5)

      • Operatoren + har højere prioritet end operatoren =

    • Som en sideeffekt ved beregningen af udtrykket tildeles variablen a værdien 12

    • Værdien af udtrykket a = i + 5 er 'højresidens værdi', altså 12.

I nedenstående program viser vi 'brug og misbrug' af assignments i C. Det røde assignment udtryk initialiserer variablene a, b, c og d til 7. Dette kan anses for en "fiks" forkortelse for 4 assignment kommandoer i sekvens, adskilt af semicolons.

Det blå fragment er mere suspekt. Reelt assignes a til værdien af 2 + 3 - 1 (altså 4). I forbifarten assignes b til 2, c til 3, og d til 1.

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

int main(void) {

  int a, b, c, d;

  a = b = c = d = 7;  /* a = (b = (c = (d = 7)))  */
  printf("a: %d, b: %d, c: %d, d: %d\n", a,b,c,d);
  
  a = (b = 2) + (c = 3) - (d = 1);
  printf("a: %d, b: %d, c: %d, d: %d\n", a,b,c,d);
  
  return 0;
}
Program 3.1    Brug og misbrug af assignments i udtryk.

Outputtet af program 3.1 vises i program 3.2.

1
2
a: 7, b: 7, c: 7, d: 7
a: 4, b: 2, c: 3, d: 1
Program 3.2    Output fra ovenstående program.

Assignment operatorerne har meget lav prioritering, hvilket indebærer at tildelningen af variablen altid sker efter beregningen af 'højresiden'.

Assignment operatorerne associerer fra højre mod venstre.

 

3.2.  Increment og decrement operatorerne
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

C understøtter flere forskellige specialiserede assignment operatorer. Principielt er disse ikke nødvendige. Vi kan altid begå os med de former for assignments vi introducerede i kapitel 1 og specielt i afsnit 1.3.

Vi starter med at se på increment og decrement operatorerne. Disse er højt prioriterede, hvilket betyder at de udføres før de fleste andre udtryk (med andre operatorer).

C understøtter særlige operatorer til optælling og nedtælling af variable.

Man kan også bruge ordinære assignments ala i = i + 1 og i = i - 1 til dette.

Vi viser herunder ++ i både prefiks og postfix form. Læg mærke til at vi diskuterer både værdien af udtryk ala ++i og i++, og effekten på variablen i.

  • Antag at variablen i har værdien 7

  • Prefix formen: ++i

    • Tæller først variablen i op fra 7 til 8

    • Returnerer dernæst værdien 8 som resultat af udtrykket

  • Postfix formen: i++

    • Returnerer først værdien 7 som resultatet af udtrykket

    • Tæller dernæst variablen i op fra 7 til 8

 

3.3.  Eksempel: increment og decrement operatorerne
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

I fortsættelse af diskussionen i forrige afsnit viser vi her et konkret eksempel på brug af increment og decrement operatorerne i et C program.

I den blå del tælles i op med 1, j ned med 1, og k op med 1. Det er principielt ligegyldigt om det sker med prefix eller postfix increment operatorer.

I den røde del indgår increment operatorerne i andre assignment operatorer, og det er derfor vigtigt at kunne afgøre værdierne af --i, j++, og --k.

Først tælles i ned til 3, som så assignes til res1. Dernæst assignes værdien af j (som på dette sted i programmet er 3 til) res2, hvorefter j tælles op til 4. Med dette ændres værdien af variable j altså fra 3 til 4. Endelig tælles k ned til 5, og den nedtalte værdi assignes til res3.

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

int main(void) {
  
  int i = 3, j = 4, k = 5;
  int res1, res2, res3;
  
  i++; j--; ++k;
  /* i is 4, j is 3, k is 6 */

  printf("i: %d, j: %d, k: %d\n", i,j,k);

  res1 = --i;
  res2 = j++;
  res3 = --k;

  printf("res1: %d, res2: %d, res3: %d\n", res1, res2, res3);
  printf("i: %d, j: %d, k: %d\n", i,j,k);
  
  return 0;
}
Program 3.3    Illustration af increment og decrement operatorerne.

Outputtet af programmet vises herunder. Vær sikker på at du kan følge ændringerne af de forskellige variable.

1
2
3
i: 4, j: 3, k: 6
res1: 3, res2: 3, res3: 5
i: 3, j: 4, k: 5
Program 3.4    Output fra ovenstående program.

Herefter opsummerer vi vores forståelse af increment og decrement operatorerne.

Sondringen mellem prefix og postfix relaterer sig til tidspunktet for op/nedtælling af variablen relativ til fastlæggelsen af returværdien.

Hvis man bruger increment- og decrementoperatorerne som kommandoer, er det ligegyldigt om der anvendes prefix eller postfix form.

 

3.4.  Andre assignment operatorer
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Foruden increment og decrement operatorerne fra afsnit 3.3 findes der også et antal akkumulerende assignment operatorer, som vi nu vil se på. At akkumulere betyder at 'hobe sig op'. I forhold til variable og assignments hentyder betegnelsen til at vil oparbejder en værdi i variablen, som er beregnet ud fra den forrige værdi ved enten at tælle det op eller ned.

Ligesom increment og decrement operatorerne er de akkumulerende assignment operatorer i bund og grund overflødige. Vi kan sagtens klare os med den basale assignment operator, som beskrevet i kapitel 1. Der kan dog være en lille effektivitetsgevinst ved at bruge increment, decrement, og de akkumulerende assignment operatorer. Mere væsentligt er det dog, at mange programmører bruger disse; og vi skal naturligvis være i stand til at forstå programmer skrevet af sådanne programmører.

C understøtter akkumulerende assignment operatorer for +, -, *, / and flere andre binære operatorer

Herunder vises den generelle syntaks af de nye akkumulerende assignment operatorer. op kan f.eks. være + eller -.


variable op= expressions   
Syntaks 3.1    

I syntaks 3.2 viser vi den basale assignment operator, som beskrevet i afsnit 1.1, i en situation som er ækvivalent med syntaks 3.1.


variable = variable op (expression)
Syntaks 3.2    

Vi illustrerer igen med et konkret C program. I det røde assignment tælles i én op. I det blå assignment j ned med værdien af i. I det lilla assignment ganges k med værdien af j. I alle tre tilfælde udfører vi altså et assignment til hhv. i, j og k.

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

int main(void) {

  int i = 3, j = 7, k = 9;

  i += 1;      /*  i = i + 1; */
  j -= i;      /*  j = j - i; */
  k *= j;      /*  k = k * j; */

  printf("i: %d, j: %d, k: %d\n", i, j, k);
  
  return 0;
}
Program 3.5    Et program med forskellige optællinger og nedtællinger - modsvarer tidligere vist program.

Outputtet af programmet vises herunder.

1
i: 4, j: 3, k: 27
Program 3.6    Output fra ovenstående program.

Du kan få en oversigt over alle akkumulerende assignment operatorer i C i tabel 2.3, nærmere betegnet i prioritetsklasse 2 (anden række regnet fra bunden af tabellen).

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