Hallo,
Ich möchte bei einer case- Anweisung von 0-26 abfragen, geht das
überhaupt mit switch case und wie wenn ja?
switch(x) {
case 0...26: break;
case: break;
case: break;
}
Vielen Dank für Eure Hilfe;
lg
Hannes
Ich weiß nicht, wie clever die einzelnen Compiler sind, aber Michaels
Lösung würde wohl meist in eine uneffektive Abfrageorgie übersetzt
werden. Das ist nix.
Bastis "Lösung" ist hier vermutlich zu unübersichtlich, sonst wäre ja
nicht nach switch gefragt. Wenn man einen Haufen Einzelwerte hat, aber
auch ein Grüppchen, macht man das nicht mit einem Berg else if, sondern
packt den Bereich ins default:
switch(x) {
case 42: dings(); break;
case 99: bums(); break;
case 111: bla(); break;
default:
if (x >= 0 && x <= 26)
foo();
else
bar();
break;
}
Sollte m.E. flott und dabei zumutbar übersichtlich sein.
kein problem, aber eher unschön:
switch (käsekuppe)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
[...]
case 24:
case 25:
case 26:
anweisung();
break;
case 27:
break;
default:
break;
}
wenn du die "break's" weglässt, rennt er durch bis zum ersten "break".
pumpkin
>> Wo ist der Unterschied??> das drumrum, sonst nix
mmmh, mal wieder eine gefährliche aussage.
kommt auf deine datentypen an. bei integer ist da kein unterschied, aber
bei gebrochenen zahlen (float, etc) ist der unterschied gewaltig (und
selbsterklärend).
pumpkin
> das dürfte dann aber wirklich in 26 Einzelvergleiche hinauslaufen,> logisch zwar korrekt, aber laufzeitmässig ziemlich mangelhaft...
danke für den hinweis.
"kein problem, aber eher unschön:"
pumpkin
> das dürfte dann aber wirklich in 26 Einzelvergleiche hinauslaufen,> logisch zwar korrekt, aber laufzeitmässig ziemlich mangelhaft...
Unterschätzt den Compiler nicht. Was switch-statements angeht sind die
recht leistungsfähig, kennen diverse Varienten der Codegenerierung,
rechnen ein bischen herum und suchen sich die passende aus. Da sind auch
welche drunter, die man in Assembler-Programmierung kaum vernünftig
hinbekommt, wie beispielsweise der recht häufig genutzte tree search
(hier wohl nicht relevant). Lieber mal ausprobieren und nachsehen.
Das sehe ich wie A.K. Der Compiler macht es schon effektiv, egal wie
unsortiert der Input sein mag.
Die Lösung von Michael ist zwar länglich, aber klar und deutlich, ohne
Gemurkse.
unser compiler für ppc`s bekommt das ganz gut auf die reihe, selbst für
komplizierte "mischungen".
um sicher zu gehen, lieber ein if konstrukt verwenden, wenn es bei einem
oder 2 bereichen und vielen einzelabfragen bleibt, ist das nicht
unübersichtlich, zudem ist man sicher das kein ellenlanger asm code
produziert wird, egal welchen compiler man nutzt.
d.
ps.: da ist sie man wieder, die harwareunabhängigkeit von c, die alle in
den wahnsinn treibt...
wie wäre es dennn mit dem hier:
if (x >= 0 && x < 27) case 0..27
{
...
}
else if( x >= 27 && x < 30 ) case 27..20
{
...
}
else if( x >= 30 && x < 35 )case 30..35
{
...
}
usw...
else default
if (x >= 0 && x < 27) case 0..27
{
...
}
else if( x < 30 ) case 27..20
{
...
}
else if( x < 35 )case 30..35
{
...
}
du meinst wohl so...
nachteil:
verschachtelung, wie bei allen if else Konstrukten...
d.
@crazy horse:
while (1) {
loop++;
switch (loop) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
test();
break;
default:
break;
}
}
wird bei GCC (-Os) zu
.L20:
adiw r28,1
cpi r28,11
cpc r29,__zero_reg__
brsh .L20
rcall test
rjmp .L20