Aber zum thema, Du kannst auch else if nutzen, also nicht else, sondern else if, dann wird auch nur eine Möglichkeit wahr.
An sich ist das richtig. Das Problem hier ist aber an sich weniger switch als der Datentyp der verwendet wird. Hinzu kommt dass das Ergebnis bei switch und if - else if zwar wie das selbe wirken mag, es jedoch ein anderes ist.
Ich beziehe mich im folgenden erst mal nur auf C++. Es ist zwar in vielen Sprachen so, gibt aber bei manchen Sprachen in Teilen Ausnahmen.
Bei if bzw. if - else wird ein Sprung aufgrund einer Bedingung berechnet. Das bedeutet die Bedingung wird im Normalfall zur Laufzeit berechnet und aufgrund dessen wird ein Sprung zum passenden Code ausgeführt. Hier kann es natürlich vorkommen dass der Compiler optimiert was hier aber erst mal außer acht zu lassen ist. Wird ein else if Zweig ausgeführt bedeutet dass das eine vorherige Bedingung zu einem Sprung zu dem jeweiligen else Zweig geführt hat. Dieser Zweig besteht nun aus einem weiteren if Konstrukt. Das bedeutet wenn wir nun folgenden Aufbau haben:
|
C-/C++-Quelltext
|
1
2
3
4
5
|
if(a == 0) {
} else if(a == 1) {
} else if(a == 2) {
} else if(a == 3) {
}
|
und a würde den Wert 3 haben, so würden 4 Bedingungen geprüft werden bis der passende Codezweig angesprungen werden kann.
Bei einem Switch sieht das nun anders aus. Die Werte die pro case-Zweig angenommen werden können müssen konstant und einmalig sein. Das bedeutet mit switch case kannst du folgendes nicht tun:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
int a;
int b;
// .....
switch(a) {
case b:
break;
}
|
weil in diesem Fall b keine konstante ist. Das erlaubt dem Compiler aber viele Möglichkeiten zur Optimierung. Der Compiler hat zum Beispiel die Möglichkeit eine Sprungtabelle zur Übersetzungszeit zu generieren und zur Laufzeit zu nutzen.
Jetzt kann es natürlich sein dass ein Compiler so smart ist dass er das selbe macht wenn dein if - else if Konstrukt durch ein switch Konstrukt zu ersetzen wäre. Compiler sind teilweise unglaublich klug und effizient wenn es um Optimierung geht. Aber selbst in dem Fall hätte man immer noch den Unterschied dass in dem switch Konstrukt nur konstante Werte verglichen werden können, wohingegen if Konstrukte mehr Freiheiten lassen.
@Unbegabt83: Wann sollte man nun was verwenden? Das bleibt dem Entwickler überlassen. Die meisten werden dazu neigen switch einzusetzen wann immer es möglich ist. So tue ich es und so habe ich es eigentlich auch fast immer gesehen. Du wirst dich schnell daran gewöhnen das automatisch zu entscheiden. An sich dürftest du aber natürlich auch immer if - else if - else if und so weiter schreiben.
@David:
Das ist so nicht ganz richtig. In vielen Fällen ist es so dass der Wert vom char einfach dem ASCII Wert entspricht. Aber der C++ Standard legt das nicht genau fest. Wie du weißt gibt es signed char und unsigned char. Welchem der beiden nun ein char entspricht ist im Standard nicht festgelegt.
Quelle
Für die denen nicht klar ist was signed char oder unsigned char ist. Unsigned char hat einen Wertebereich von 0 bis 255. Dabei entsprechen die Werte den ASCII Werten der Zeichen. Signed char hat einen Wertebereich von -128 bis 127. Dabei entsprechen die Werte den ASCII Wert des Zeichens minus 128. Der Standard legt nur fest dass ein char entweder ein signed char oder ein unsigned char ist. Der/Die Entwickler eines Compilers dürfen nun selbst entscheiden wie sie das ganze behandeln. Deshalb ist es sinnvoll einen char Wert auch nur mit char Konstanten und nicht mit int Konstanten zu vergleichen.