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
15 svar · 683 visningar · startad av Mc Fetto
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?
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
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?
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å.
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.
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.
@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.
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!
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
}
Intressant, var är texten saxad ifrån?
intressant läsning!
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.
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.
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
...