Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

01.08.2012, 13:17

Verständnis von 'if' 'else' 'else if'

Hallo Community,

beim Programmieren bin ich auf eine Frage gestoßen, die ich mir nach langem Suchen und Überlegen noch nicht beantworten konnte. Es geht um 'if', 'else if' und 'else'.

Macht es einen Unterschied ob ich schreibe:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
if (Bedingung1)
{ mache...}

if {Bedingung2)
{mache...}

if (Bedingung3)
{mache...}


usw.

oder ob ich schreibe:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
if (Bedingung1)
{mache...}

else if (Bedingung2)
{mache...}

else if (Bedingung3)
{mache...}


???

Gibt es da einen Unterschied?

Und zweitens, ist bei Verwendung von 'else if' zum Abschluss auch immer ein 'else' für alle anderen Fälle erforderlich oder kann 'else if' auch ohne abschließendes 'else' stehen?

Irgendwie stehe ich gerade auf dem Schlauch. :hmm:

Danke im Voraus.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

01.08.2012, 13:24

Es macht einen Unterschied.

Bei deinem ersten Beispiel steht jede If-Abfrage für sich allein, das heißt, jede von ihnen wird aufgerufen.

Im zweiten werden die restlichen nicht aufgerufen, wenn Bedingung 1 = true.

Else-If verschachtelt praktisch nur, du kannst für Beispiel 2 auch schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
if (Bedingung1) {
  mache...
}
else {
  if (Bedingung2) {
    mache...
  }
  else {
    if (Bedingung3) {
      mache...
    }
  }
}


Macht für den Compiler keinen Unterschied, ist nur unübersichtlicher^^

Else-if kann auch ohne abschließendes else stehen, wobei es egtl. kein else-if, sondern nur if und else gibt.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

3

01.08.2012, 13:32

Danke für die schnelle Antwort.

Das heißt im Ergebnis dann, das die Variante 'else if' schneller ist als mehrere 'if's hintereinander, weil der Compiler nicht den ganzen Code durchgeht sondern aufhört wenn eine der Bedingungen erfüllt ist, oder?

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

4

01.08.2012, 13:37

Fast richtig.

Der Compiler schreibt natürlich alles in Maschinencode um, aber während der Laufzeit werden die Abfragen, afaik, übersprungen, macht dein Programm also beim Ausführen schneller (theoretisch, und dann auch nur ein gaaaaanz kleines bisschen).

EDIT:

Wurde grad im Chat nochmal darauf aufmerksam gemacht:

Mach dir klar, dass es hier nicht nur um Geschwindigkeit geht (bzw. bei heutigen Rechnern gar nicht mehr), sondern um die Ausführung des Codes.

Wenn du z.B. Funktionen schreibst, die je nach Erfolg einen Boolean-Wert zurückgeben, dann musst du aufpassen was du tust.
Solche Funktionen wirst du z.B. bei Engines finden, die bei Fehlern false rauswerfen.

Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main() {
  int zahl1 = 10;
  int zahl2 = 5;

  if(FunktionEins()) {
    //..
  }
  if(FunktionZwei(&zahl1, &zahl2)) {
    //..
  }
  std::cout << zahl1;
  return 0;
}

bool FunktionEins() {
  //..
  return true;
}

bool FunktionZwei(int *zahl1, int *zahl2) {
  *zahl1 += *zahl2;
  return true;
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main() {
  int zahl1 = 10;
  int zahl2 = 5;

  if(FunktionEins()) {
    //..
  }
  else if(FunktionZwei(&zahl1, &zahl2)) {
    //..
  }
  std::cout << zahl1;
  return 0;
}

bool FunktionEins() {
  //..
  return true;
}

bool FunktionZwei(int *zahl1, int *zahl2) {
  *zahl1 += *zahl2;
  return true;
}


Im ersten Codebeispiel bekommst du in der Konsole eine 15, im zweiten Beispiel eine 10.
Wieso? Weil im ersten jede Abfrage bearbeitet wird, im zweiten aber die zweite übersprungen wird, weil die erste ja schon wahr ist.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »Nimelrian« (01.08.2012, 14:01) aus folgendem Grund: Zusätzliche Infos


5

01.08.2012, 13:48

Ok, jetzt habe ich's kapiert.

Vielen vielen Dank für deine Antwort!!!

:thumbsup:

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

6

01.08.2012, 13:54

Schau eben nochmal 2 Beiträge nach oben, nicht, dass du da was falsch verstehst ;)
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

7

01.08.2012, 14:45

Danke für die Ergänzung, das habe ich (auch) verstanden. :)

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

01.08.2012, 16:32

Ein simples Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
bool a = true;
bool b = true;

if ( a ) 
    cout << "1st hit" << endl;

if ( b )
    cout << "2nd hit" << endl;


Mit else if:

C-/C++-Quelltext

1
2
3
4
5
6
7
bool a = true;
bool b = true;

if ( a ) 
    cout << "1st hit" << endl;
else if ( b )
    cout << "2nd hit" << endl;


Die Ausgaben sind komplett unterschiedlich, weil bei Variante 2 der else-Zweig nie betreten wird.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

10

01.08.2012, 16:53

Danke BlueCobold,

ein kleines aber sehr verständliches Beispiel. :thumbup:

Werbeanzeige