Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avEllen Sundqvist
1
Flödeskontroll Satser i ett program utförs en och en efter varandra. Detta kallas sekvensiell flödeskontroll. Ofta är det dock nödvändigt att modifiera flödet om ett villkor är uppfyllt eller om vi vill upprepa flera satser. Med if, if-else och switch-satser så kan ett val bland alternativ göras. Med while, for och do-while så kan vi åstadkomma upprepningar i vårt program. Eftersom operatorer ofta används för att göra valen så börjar vi med en genomgång av dom. Cache-minne
2
Relation, likhet och logiska operatorer
Relationsoperatorer mindre än < större än > mindre än eller lika med <= större än eller lika med >= Likhetsoperatorer lika med == inte lika med != Logikoperatorer negation ! logiskt ”och” && logiskt ”eller” || Visa OH med operator precedence and associativity!
3
Relationsoperatorer Alla relationsoperatorer är binära, dvs de tar två uttryck som operander. Som resultat av operatorerna får vi int värdet 0 (falskt) eller 1 (sant). Exempel a < 3 a > b -1.3 >= (2.0 * x + 3.3) a < b < 3 /* syntaktiskt korrekt men förvirrande. Varför? */ Däremot så är inte följande korrekt: a =< b /* fel ordning på = och < */ a < = b /* mellanslag är inte tillåtna */ a >> b /* bitvis shiftning */ Tabell på s. 150, rita på tavlan
4
Likhetsoperatorer Likhetsoperatorerna är == och !=
Exempel: c == ’A’ k != -2 x + y == 3 * z - 7 Men däremot så är inte följande korrekt a = b /* tilldelning */ a = = b /* extra mellanslag ej tillåtet */ (x + y) =! 44 /* syntax error: samma som (x + y) = (!44) Tabell s. 153 Vanligt nybörjarfel: if (a = 1) /* syntaktiskt korrekt! */ printf(”a är 1”);
5
Logiska operatorer Logiska operatorer är !, && och || !a !(x + 7.7)
!(a < b || c < d) a && b a || b !(a < b) && c 3 && (-2 * a + 7) Men däremot så är inte följande korrekt a && /* en operand saknas */ a | | b /* extra mellanslag */ a & b /* bitwis operation, INTE samma som && */ &b /* minnesadressen till variabeln b */ Tabell s. 155
6
Semantik I C betecknar heltalsvärdet noll falskt och ickenoll sant.
expr1 expr expr1 && expr2 expr1 || expr2 noll noll noll icke noll icke noll noll icke noll icke noll Tabell s. 156 I C betecknar heltalsvärdet noll falskt och ickenoll sant. Alltså är t.ex. 532 och -345 sant.
7
”Kortslutning” När datorn utvärderar sanningen i ett uttryck så slutar evalueringen så snart utkomsten är känd Om vi har expr1 && expr2, så kommer inte expr2 att utvärderas om expr1 är falskt. int cnt = 0; while (++cnt <= 3 && (c = getchar()) != EOF) /* do something */ När uttrycket ++cnt <= 3 är falskt så kommer inte nästa tecken att läsas från stdin.
8
Block Ett block är en mängd deklarationer eller uttryck som är omgivna av krullparenteser {}. Där man kan sätta in ett uttryck så är det tillåtet att lägga in ett block. Blocket är i sig själv ett uttryck. Ett vanligt användningsområde för block är för att åstadkomma den rätta flödet i en if, for eller while-sats. int a = 1, b = 2; if (a > b) printf(”Jaså?”); printf(”a > b!!!”); /* indentering korrekt? */ Exempel på sid. 158
9
if och if-else Generella formen är
if (expr) statement Om expr är ickenoll (dvs. sant) så utförs statement, annars hoppas statement över och kontroll ges till nästa sats. if (grade >= 90) printf(”Congratulations!\n”); printf(”Your grade is %d.\n”, grade); Om grade >= 90 så skrivs ett gratulationsmeddelande ut innan betyget skrivs.
10
if och if-else if (y != 0.0) /* question: why must we check this? */
x /= y; if (j < k) min = j; printf(”j is smaller than k\n”); if (j < k) { } Rita fler exempel s på tavlan
11
while Repetition av sekvenser är en av fördelarna med datorer. En dator blir, till skillnad från en människa, aldrig less på att upprepa samma saker hela tiden. while (i++ < n) factorial *= i; while ((c = getchar()) != EOF) { if (c >= ’a’ && c <=’z’) ++lowercase_letter_cnt; ++total_cnt; } Exempel s. 164
12
cnt_char.c
13
for for (expr1; expr2; expr3) statement next statement
är semantiskt samma sak som expr1; while (expr2) { expr3; }
14
Exempel for (i = 1; i <= n; i++) factorial *= i;
for (j = 2; k % j == 0; ++j) { printf(”%d is a divisor of %d\n”, j, k); sum += j; } Men däremot så är inte följande korrekt: for (i=0, i < n, i += 3) /* semikolon fattas */ sum += i;
15
Exempel 2 i = 1; sum = 0; for (; i <= 10; ++i) sum += i;
gör samma sak som for (; i <= 10; ) sum += i++; Tavlan: i = 1; sum = 0; for ( ; ; ) { sum += i; } oändlig loop men inte följande: i = 1; for ( .... ) sum = 0; for ( .... ) for ( ; ; ) { for ( .... ) if (i > 10) break;
16
Komma-operator Lägst prioritet av alla operatorer i C har kommaoperatorn , Den är vänster-höger associativ så i ett uttryck av formen expr1 , expr2 så kommer expr1 att utvärderas först och sedan utvärderas expr2 En vanlig användning av kommaoperatorn är i for-loopar for (sum = 0, i = 1; i <= n; ++i) sum += i; for (sum = 0, i = 1; i <= n; sum += i, ++i) /* samma som for ovan */ ; /* tom sats */ for (sum = 0, i = 1; i <= n; ++i, sum += i) /* ej samma resultat! */ ; Bortse från - tecken innan expr1, expr2!!!!
17
do-while Istället för att göra test i början som while, så gör do-while sitt test i slutet. do { i++; if (i > 10) finished = 1; /* flagga, ej bra programmeringsstil! */ } while (!finished); printf(”Mata in din ålder!\n”); scanf(”%d”, &age); } while (age < 0); En do-while loop kommer alltid att utföras minst ett varv!
18
break och continue För att bryta det normala flödet, så kan break och continue användas. break bryter den innersta loopen eller switchen. while (1) { /* 1 is always true */ scanf(”%lf”, &x); if (x < 0.0) break; printf(”%f\n”, sqrt(x)); } /* break jumps to here */ Exempel i mitten på sid 180
19
switch switch är en ”multi-konditions if”. switch (c) { case ’a’:
++a_cnt; break; case ’b’: case ’B’: ++b_cnt; default: ++other_cnt; }
20
Konditionsoperatorn Konditionsoperatorn ?: är ovanlig då den är en tertiär operator (den tar tre uttryck som operatorer). if (y < z) x = y; else x = z; x = (y < z) ? y : z;
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.