webForumDet fria alternativet

case eller if-satser

15 svar · 683 visningar · startad av Mc Fetto

Mc FettoMedlem sedan nov. 20022 355 inlägg
#1

Tja, jag har en liten fundering. Vad är det för skillnader på if och case satser. Hörde/läste ngn stanns att case-satser är snabbare (vilket jag kan betvivla/alternativt kan vara för olika språk).

Jag har endast använt case-satser i consol-program där man vill ha en meny, men större användningsområden än så kan ju vara bra. Eller är det bara en smaksak?

Ideér, tankar eller vetandes?

@ndersMedlem sedan juni 200032 969 inlägg
#2

Vad gäller det för språk?

I VB fungerar det i alla fall så att du i en select case endast kan ha ett villkor. En if-sats kan ju bero på fler saker, så att säga.

Mvh

Mc FettoMedlem sedan nov. 20022 355 inlägg
#3

Det gäller alla språk :D, jag kan inte se ngt direkt som gör att man ska använda en case-sats istället för en if-sats. Därför undrar jag om ngn har en ide på användningsområde eller om case-satser är effektivare eller vad?

OveRRidEMedlem sedan feb. 200112 078 inlägg
#4

Case och If skiljer sig en aning från varandra i både VBScript och VB iallafall, ja. Case skiljer sig lite mellan VB och VBScript också.

För att rätta @nders ( :r ); i VB kan man faktiskt använda Case Is, som ser ut ungefär såhär;

Select Case lNum
Case Is > 0.5
    lNumVar = 2
Case Is > 0.7
    lNumVar = 3
Case Else
    lNumVar = 4
End Select

Detta fungerar dock inte i VBScript. I VBScript fungerar inte någon annan logisk operator än likamed (=) i Case-satser, så det är nog mestadels till för att snygga upp kod från fula If-satser.

Därför undrar jag om ngn har en ide på användningsområde eller om case-satser är effektivare eller vad?

Som jag sa; snyggare kod. Huruvida det är med prestanda vet jag inte, men om jag skall vara riktigt ärlig så kan jag faktiskt tänka mig att det är mer prestandasnålt att använda Case eftersom den bara har en 'inparameter' så att säga. If måste hålla reda på lite mer, antar jag. Det sista är gissningar, så jag kan inte garantera huruvida det faktiskt är så.

UlfTMedlem sedan maj 20018 027 inlägg
#5

Om du vill ha mer än två alternativa val för vad du ska göra, beroende på en enda parameter, ser det klart snyggare ut i koden att använda case-satsen, istället för en mängd if-satser. Om det går snabbare med case, vet jag inte. Men jag tror knappast att det går långsammare. Däremot vinner du på att du får en mer lättläst kod. Och det är en vinst du inte kommer förakta senare när du får behov av att vidareutveckla programmet.

@ndersMedlem sedan juni 200032 969 inlägg
#6

OveRRidE skrev:

För att rätta @nders ( :r ); i VB kan man faktiskt använda Case Is

Det är inte riktigt att rätta mig, för det var inte så jag menade. ;)

Det jag menade var, att använder du select case kan du göra jämförelsen på den variabel som select case-satsen är definierad för, men du kan inte sätta tilläggsvillkor. Du kan göra så här:

If i=1 then
     ' foo
elseif i=2 and p=4 then
     ' bar
end if

Du får i så fall göra så här:

select case i
    case 1
          ' foo
    case 2
          if p = 4 then
                 'bar
          end if
end select

Så allt går att lösa med select case, men lite klurigare, och kladdigare, blir det.

OveRRidEMedlem sedan feb. 200112 078 inlägg
#7

@nders skrev:

Det är inte riktigt att rätta mig, för det var inte så jag menade.

Ah. Jag blandade ihop det med operatorerna. Sorry.

Däremot; Case Is är lite intressant i VB's fall.

Mc FettoMedlem sedan nov. 20022 355 inlägg
#8

Jo, men då kan man ju lika bra kasta case-satsen i sjön och bara köra på if-satser. Jag tycker då inte det är lättläsligare med case-satser än med if-satser, men det är ju min smak och man bör väl rätta sig åt mängden när det gäller utförandet!

D3VaST8DMedlem sedan dec. 2000485 inlägg
#9

Största skillnaden mellan i att använda CASE eller IF är hur applikationen skall användas.

If the case expressions are contiguous or nearly contiguous integer values, most compilers translate the switch statement as a jump table instead of a comparison chain. Jump tables generally improve performance because they reduce the number of branches to a single procedure call, and shrink the size of the control-flow code no matter how many cases there are. The amount of control-flow code that the processor must execute is also the same for all values of the switch expression.

However, if the case expressions are noncontiguous values, most compilers translate the switch statement as a comparison chain. Comparison chains are undesirable because they use dense sequences of conditional branches, which interfere with the processor's ability to successfully perform branch prediction. Also, the amount of control-flow code increases with the number of cases, and the amount of control-flow code that the processor must execute varies with the value of the switch expression.

For example, if the case expression are contiguous integers, a switch statement can provide good performance:

switch (grade)
{
case 'A':
...
break;
case 'B':
...
break;
case 'C':
...
break;
case 'D':
...
break;
case 'F':
...
break;
}

But if the case expression aren't contiguous, the compiler may likely translate the code into a comparison chain instead of a jump table, and that can be slow:

switch (a)
{
case 8:
// Sequence for a==8
break;
case 16:
// Sequence for a==16
break;
...
default:
// Default sequence
break;
}

In cases like this, replace the switch with a series of if-else statements:

if (a==8) {
// Sequence for a==8
}
else if (a==16) {
// Sequence for a==16
}
...
else {
// Default sequence
}

@ndersMedlem sedan juni 200032 969 inlägg
#10

D3VaST8D, har du en länk till källan? Ser intressant ut. :)

mvh

Mc FettoMedlem sedan nov. 20022 355 inlägg
#11

Intressant, var är texten saxad ifrån?

D3VaST8DMedlem sedan dec. 2000485 inlägg
Mc FettoMedlem sedan nov. 20022 355 inlägg
#13

intressant läsning!

PeWMedlem sedan juni 200010 432 inlägg
#14

Har man många vägval på samma variabel är det ivf betydligt renare med switch & case och därmed betydligt mer lättläst. Vidare är det enkelt att bygga ut en redan påbörjad dito.

spangoMedlem sedan juni 20008 205 inlägg
#15

Dessutom (i C-liknande språk) kan man göra en massa luriga fall-throughs som både är eleganta och ger bättre jobbsäkerhet.

PaceMedlem sedan juni 20019 024 inlägg
#16

En annan fördel med case är om man har data som man på förhand vet vad den kommer att innehålla. Jämför följande case-sats med if-satsen nedan:

Select Case var
   Case 1, 6, 7, 34, 632, 3894
      ' do this
   Case 2, 5, 8, 9, 127
      ' do that
   Case Else
      ' do all
End Select
If (var = 1) Or (var = 6) Or (var = 7) Or (var = 34) Or (var = 632) Or (var = 3894) Then
   ' do this
ElseIf
...
137 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)