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

Unbegabt83

Frischling

  • »Unbegabt83« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Mörfelden-Walldorf

Beruf: habe ich

  • Private Nachricht senden

1

17.01.2017, 16:49

Switch Konstrukt - ich verstehe das nicht

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>

using namespace std;

int main()
{
  //Variablen
  int Choice;    //Eigentlich char chChoice demnach alle Choice chChoice
  
  //Menü
  do
  {
    cout <<"Menue"<<endl;
    cout <<"1 Punkt"<<endl;
    cout <<"2 Punkt"<<endl;
    
    //Auswahl abfragen
    cin>>Choice;
    
    
    //Verzweigung je Eingabe
    switch(Choice)
    {
      //Option 1 
      case ('1'):
      {
        cout<<"Test 1"<<endl;
      }break;
    
      //Option 2
      case ('2'):
      {
        cout<<"Test 2"<<endl;
      }break;
    
      //alle anderen Optionen
      default:
      {
        cout << "Falsche Eingabe!\n\n";
      }
    
    }
  }while (Choice != '3');
}


Hallo zusammen,

wie ihr am Beispiel oben seht, wollte ich das switch- Konstrukt mit zahlen nutzen. Im Buch macht Herr Kalista das mit Buchstaben.
Klug wie ich bin, die zahl ist ja ein int Wert, änder ich alles ab und siehe da geht nicht. Er erkennt weder 1-20 (ja alles ausprobiert :D)
Ändere ich wie als Kommentar geschrieben den Wert auf char geht es. Nun stehe ich vor einem Rätsel. Warum???

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Unbegabt83« (18.01.2017, 07:53)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

17.01.2017, 17:13

Hallo!
Kennst du den Unterschied zwischen '1' und 1?

PS: switch ist keine Funktion, sondern ein "Konstrukt".

Unbegabt83

Frischling

  • »Unbegabt83« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Mörfelden-Walldorf

Beruf: habe ich

  • Private Nachricht senden

3

18.01.2017, 07:53

Jetzt bin ich verunsichert.

Ich denke das '' die Angabe dazwischen als Klarname speichert.
und ohne '' als zahl bzw Wert.

Aber nach der frage habe ich da scheinbar irgendwas falsch

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

18.01.2017, 13:42

'1' ist ein char und 1 ein int. Du kannst '1' in einen int Umwandeln. '1' entspricht dann aber nicht dem int Wert 1. Wenn du jetzt 20 eingibst dann hast du zwei char Werte, '2' und '0'. Guck noch mal ins Kapitel zum Thema Datentypen. Vielleicht hilft das dann schon weiter.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

@zimmer

Alter Hase

Beiträge: 1 135

Wohnort: NRW Germany

  • Private Nachricht senden

5

18.01.2017, 19:59

Boa, dein Foto sieht so relaxt aus, ich bin neidisch.
Aber zum thema, Du kannst auch else if nutzen, also nicht else, sondern else if, dann wird auch nur eine Möglichkeit wahr.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

18.01.2017, 20:02

'1' ist vom Typ char und hat als Zahl den ASCII-Wert des Zeichens "1", welcher 49 ist.
1 ist vom Typ int und stellt wirklich die Zahl 1 dar.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

18.01.2017, 20:32

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.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige