![]() ![]() ![]() | Introduktion til programmering 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 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.
|
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; } | |||
|
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 | |||
|
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.
|
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; } | |||
|
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 | |||
|
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 -.
| |||
|
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.
| |||
|
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; } | |||
|
Outputtet af programmet vises herunder.
1 | i: 4, j: 3, k: 27 | |||
|
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).