Programmeringsspråket C

switch-sats

if-satser i all ära...

...men i vissa fall upptäcker man att de blir lite för många. Då uppkommer vad som av oss skämtsamt kallas en "jommpa-lösning", uppkallad efter en programmerare som skrev ett tic-tac-toe-program nästan undantagslöst med if-satser. (Obs! "jommpa-lösning" är ingen vedertagen programmeringsterm!) Betrakta följande menyexempel.

char choice;
 
printf("Valj ett av alternativen.\n");
printf("    (N)ytt spel\n");
printf("    (L)adda spel\n");
printf("    (H)jalp\n");
printf("    (A)vsluta\n");
 
printf("\nDitt val: ");
scanf("%c", &choice);
 
if (choice == 'N' || choice == 'n')
    printf("Du valde nytt spel!\n");
else if (choice == 'L' || choice == 'l')
    printf("Du valde att ladda ett gammalt spel!\n");
else if (choice == 'H' || choice == 'h')
    printf("Hjalp? Jag ar inte bra pa att hjalpa!\n");
else if (choice == 'A' || choice == 'a')
    printf("Men... inte vill du val avsluta mig!?\n");
else
    printf("Ogiltigt kommando!");

Först skrivs menyalternativen ut, sen skrivs en lockande prompt ut. Efter det läser vi in ett tecken med scanf(). Det ser ut precis som man skulle kunna gissa om man har jobbat med printf() och scanf() tidigare. Sedan kommer ett gäng if-satser, för att ta reda på vad man valde. Notera hur de kollar både stora och små bokstäver. Som du minns från del 4 så betyder teckenkombinationen || (två vertikala streck) i if-satser eller loopar eller.

Denna soppa av if-satser är inte tilltalande för någon och blir bara desto värre ju fler menyalternativ som kommer till. Lyckligtvis finns flera lösningar, och den vi ska gå igenom här kallas switch-sats. Den fungerar så att den kollar värdet på en variabel, och beroende på vad det är, utför den olika saker. Lummigt förklarat, jag vet. Studera exemplet nedan:

switch (heltal) {
case 42:
    printf("Nejmen! Svaret!\n");
    break;
case 13:
    printf("Uh-oh, olyckstal...\n");
    break;
case 117:
    printf("...som i flygplanet?\n");
    break;
default:
    printf("Nepps, markte inget speciellt med din siffra.\n");
    break;
}

switch (heltal) betyder att vi vill kolla på värdet i variabeln heltal. Om det är 42 (case 42:), ska den skriva ut följande meddelande. Och sen avbryta switch-satsen. Varför alla dessa break? Jo, de beror på en smart del av switch som kallas fall-through, och demonstreras i följande exempel. Koden härnäst är våran meny från början av denna del, fast ändrad till switch-format. Allt fram till if-satsen är identiskt med förra menyexemplet. if-satsen är utbytt med följande.

switch (choice) {
case 'N':
case 'n':
    printf("Du valde nytt spel!\n");
    break;
case 'L':
case 'l':
    printf("Du valde att ladda ett gammalt spel!\n");
    break;
case 'H': case 'h':
    printf("Hjalp? Jag ar inte bra pa att hjalpa!\n");
    break;
case 'A': case 'a':
    printf("Men... inte vill du val avsluta mig!?\n");
    break;
default:
    printf("Ogiltigt kommando!");
    break;
}

Första raden berättar för oss att vi ska kolla värdet på en variabel som vi vet sen tidigare är av char-typ. Detta är inga problem, eftersom så långt datorn bryr sig är char också ett heltal. Intressant blir nästa rad, case 'N':. Notera att den inte har någon händelse kopplad till sig. Detta är helt okej, eftersom datorn inte heller stöter på någon break, fortsätter den lugnt vidare till nästa fall. Nästa fall har en händelse kopplad till sig, och en break. Det innebär att både 'N' och 'n' har samma effekt. Jag måste avbryta kodanalysen redan här för en kort varning.

Varning: Så fort koden har hoppat in i ett fall kommer den tugga vidare genom alla andra fall tills den stöter på en break. Detta är vad som kallas fall-through; den "ramlar igenom" till nästa fall. Att man har glömt att sätta ut break på rätt ställen är en vanlig källa till buggar i switch-satser.

Samma sak gäller för L som för N. H och A ser lite annorlunda ut; båda case ligger på samma rad. Detta gör absolut ingen skillnad, som vi skrev i del 1 så får man sätta in radbrytningar och mellanrum lite hursom på de flesta ställen i C utan att programmets funktion ändras. I detta fall, med en meny så här, tycker jag det är snyggare att ha båda case på samma rad, men jag valde att ha de två första på enskilda rader för att demonstrera hur fall-through fungerar.

Sista fallet är default-fallet. Om detta finns hoppar körningen in i det förutsatt att ingen annan av fallen stämmer. Ett default-fall är inget måste, men generellt bra att ha. Det fungerar lite som else i en if-else-konstruktion.

Detta var nog allt om switch-satsen. Den används ibland, men är ingen jättevanlig konstruktion. Dock är den bra att ha i ryggsäcken när man programmerar, och eftersom den bör vara relativt lättförstådd skadar det inte att ha gått igenom den.

← Funktioner

Typer →

Copyleft kqr & slaeshjag 2009, 2012 some rights reserved