Go Down

Topic: Switch Case break (Read 415 times) previous topic - next topic

Klaus_ww

Hallo zusammen,

ich habe da ein Verständnisproblem zum Switch/Case Beispiel aus der Reference.

Code: [Select]
  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.

Ist das korrekt so?

Danke
Klaus

guntherb

Nein,
ohne Break führt er alle Anweisungen aus, die nach dem Einsprungpunkt kommen.
Grüße
Gunther

Klaus_ww

Ich hab's befürchtet  :~
Danke Gunther

maverick1509

Wieso befürchtet.
Erklär mal was daran schlimm ist....
gruß

michael_x

Quote
Erklär mal was daran schlimm ist....

Schlimm ist, dass der Compiler nicht meckert wenns fehlt, und dass gute Programmierer das "feature" nicht benutzen.
Oder, wenn überhaupt, dann so was schreiben:
Code: [Select]
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
}


uwefed

Es ist ja eben nicht falsch wenn man bei 2 Werten der Switchvariablen das gleiche machen willst.

Code: [Select]
switch (test)
{
  case 2:
  case 1:
  macht irgendwas.
  break;

  case 3;
  ...
  break;
}

Hier will man bei test = 0 und bei test = 1 das gleiche machen. So mußt Du es nicht 2 mal schreiben.
Grüße Uwe


Klaus_ww

Ä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  :smiley-sad-blue:

Aber ich habe noch andere Optimierungsmöglichkeiten  8)

Serenifly

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.

Klaus_ww


Dann solltest du mal nachlesen wie switch/case in Assembler aussieht.


Hmm, ob mir das wirklich was bringt ... aber trotzdem danke.

michael_x

#9
Feb 14, 2014, 06:04 pm Last Edit: Feb 14, 2014, 06:23 pm by michael_x Reason: 1
musst es halt mal mit einer Reihe von ifs vergleichen:

Code: [Select]
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 ...

Klaus_ww

Alles klar, ich hab jetzt den Durchblick - danke an alle!

Go Up