ich habe da ein Verständnisproblem zum Switch/Case Beispiel aus der Reference.
switch (var) {
case 1:
//do something when var equals 1
break;
case 2:
//do something when var equals 2
break;
default:
// if nothing else matches, do the default
// default is optional
}
Es steht geschrieben: Without a break statement, the switch statement will continue executing the following expressions ("falling-through") until a break, or the end of the switch statement is reached.
Jetzt nehmen wir mal an, ich schmeiße die Breaks raus und var ist 1.
Also werden die folgenden case-Anweisungen zwar durchlaufen, da sie aber nicht zutreffen wird auch nichts weiter gemacht.
Schlimm ist, dass der Compiler nicht meckert wenns fehlt, und dass gute Programmierer das "feature" nicht benutzen.
Oder, wenn überhaupt, dann so was schreiben:
switch (test)
{
case 2:
// 2 heisst : beide Testfunktionen 1 und 2
test_2();
// hier absichtlich kein break !;
case 1:
test_1();
break;
case 3;
...
break;
default:
...
break; // this break is redundant, but good style
}
Ähh, bei mir geht's um so was triviales wie Speicher. Mein ATtiny13 ist ausgereizt und ich dachte ich könnte durch weggelassene breaks was sparen. Kann ich auch, aber leider auch die damit verbundene Funktionalität
Aber ich habe noch andere Optimierungsmöglichkeiten 8)
Dann solltest du mal nachlesen wie switch/case in Assembler aussieht. Das sind i.d.R. vorberechnete Sprung-Tabellen. Das break ist dabei entweder ein return oder ein absoluter Sprung zu Ende (wodurch der restlich Code eben ausgeführt wird wenn es fehlt). Effizienter geht es kaum.
musst es halt mal mit einer Reihe von ifs vergleichen:
if ( test <=2 && test >=1 ) IrgendwasBei1oder2();
else if (test==3) Aktion3();
else { /* die default aktion */ }
Das sollte etwa Uwes Beispiel entsprechen.
Wenn du 10 cases zu einem Fall und 10 andere zu einem anderen zusammenfasst, wird das mit if eventuell günstiger.
Bei 10 verschiedenen Aktionen wirds mit 10 breaks wohl besser als mit 10 if Abfragen ...