if-Verzweigung optimieren

Gast #930180
Lesenswert?
• ▲
▼
Hallo,

habe folgende Verzweigung:
1
if (a == 1)
2
{
3
  x= 10;
4
  DoSomething;
5
} else if (a == 2)
6
  {
7
    x= 20;
8
    DoSomething;
9
  }
10
  else
11
  {
12
   /* Programm zu Ende */
13
  }

DoSomething sind Aktionen, die beide Zweige ausführen sollen. Die 
Aktionen benötigen also ( a==1) || (a == 2)

Ich möchte DoSomething aber nicht als Funktion einbauen. Wie kann ich es 
am sinnvollsten erreichen, dass ich den Code von DoSomething nicht 
zweimal abtippen muss?

Mir fällt spontan nur ein:
1
if ((a == 1) || (a == 2))
2
{
3
  DoSomething;
4
  if ( a == 1)
5
  { x = 10 }
6
  if (a == 2)
7
  { x = 20 }
8
}

Gibt es eine geschicktere Möglichkeit?
Persönliche Seite #930190
Lesenswert?
• ▲
▼
Geschickter im Sonn von lesbarer, dann vielleicht

if ((a == 1) || (a == 2))
{
  x = a * 10;  // vor DoSomething, wenn es dem 1. Code entsprechen soll
  DoSomething;
}

Ausführungstechnisch dürfte es keinen grossen Unterschied zu deiner 2. 
Variante machen.

Es ginge auch

if ((a == 1) || (a == 2))
{
  x = 10;  // vor DoSomething, wenn es dem 1. Code entsprechen soll
  if (a == 2) x += 10;
  DoSomething;
}

Oder wenn a nicht mehr gebraucht wird

if ((a == 1) || (a == 2))
{
  x = 0;
  while (a--)
    x += 10;
  DoSomething;
}

Und so weiter...
(Firma: spengergasse) #930193
Lesenswert?
• ▲
▼
Wie wäre es mit einem Switch?
evtl. hast dann nochmals in einer Methode/Funktion die du dann aufrufst 
wenn a oder b zutrifft, in den parametern den wert 10 bzw. 20 stehen


switch(zahlZuUeberpruefen)
{
  case 1:
    METHODENAUFRUF(10);

/*^^Wenn die Variabel "zahlZuUeberpruefen" gleich dem Wert vom case hat 
wird dieser eben ausgewählt und dann wird die darauf folgende Anweisung 
ausgeführt*/

  default:
    ANWEISUNG;

/*^^Statt default solltest du denke ich auch einfach "case 2" nehmen 
können, sonst bleibt alles gleich, default bedeutet eben einfach nur, 
wenn der Rest nicht zutrifft macht er den Standart durch.*/
}

hoffe ich hab dir helfen können bzw. ich hab dir nix falsches gesagt.


EDIT: bei DEINEM 2ten Vorschlag ist das iwie unlogisch wieso du 2x 
abprüfst du kannst da dann in dem Fall die äußere Abfrage komplett raus 
lassen und die beiden anderen dafür abfragen lassen
Gast #930223
Lesenswert?
• ▲
▼
>EDIT: bei DEINEM 2ten Vorschlag ist das iwie unlogisch wieso du 2x
>abprüfst du kannst da dann in dem Fall die äußere Abfrage komplett raus
>lassen und die beiden anderen dafür abfragen lassen

Les mein Posting nochmal richtig ;) Wenn ich die äußere Abfrage komplett 
rauslasse, muss ich DoSomething in beide Zweige tippen. Will ich aber 
nicht.

>Geschickter im Sonn von lesbarer, dann vielleicht
>
>if ((a == 1) || (a == 2))
>{
>  x = a * 10;  // vor DoSomething, wenn es dem 1. Code entsprechen soll
>  DoSomething;
>}

die Werte für a und x sind Beispiele. Im realen Code wird x jeweils eine 
Konstante zugewiesen, mit arithmetischen Operationen ist da nichts zu 
machen.

>In deiner 2. Version kann die Abfrage
>if(a == 2)
>umgeformt werden in eine else-Verzweigung von if(a == 1), da ja nur bei
>a == 1 oder 2 reingesprungen wird.

Stimmt. Ist das dann Prozessortechnisch optimaler?
#930380
Lesenswert?
• ▲
▼
Siehe 2. Beispiel ;). Wobei im allg. Fall
1
if (a == ca)
2
{
3
  x= va;
4
  DoSomething;
5
} else if (a == cb)
6
  {
7
    x= vb;
8
    DoSomething;
9
  }
10
  else
11
  {
12
   /* Programm zu Ende */
13
  }

natürlich auch
1
switch(x=va, a)
2
{
3
  case cb:   x+=vb-va;
4
  case ca:   DoSomething;
5
             break;
6
      
7
  default:   // ...
8
}

funktioniert, was dann auch auf beliebig viele Fälle erweiterbar ist. 
Die Konstantenrechnungen werden eh wegoptimiert.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.