![]() ![]() ![]() | Introduktion til programmering i C |
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. 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 |
|
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.
|
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:
|
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; } | |||
|
1 | res1 = 8, res2 = 8, res3 = 18 | |||
|
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 |