Switchanweisung und Variablendeklaration
-
Hallo zusammen,
ich bin seit einigen Wochen (Monaten) dabei mir etwas C++ anzueignen. Angefangen habe ich mit einigen Internet-Tutorials, aber irgendwie... bin ich dann doch zu einem Buch gekommen - finde ich eindeutig vorteilhafter. Jedenfalls, ich erwarte nichts dolles, will es auch nicht schnell erlernen - ist halt mehr eine Art "Hobby". Trotzdem habe ich aber vor, wenigstens die Sachen, die ich lerne auch zu verstehen und nicht irgendwelche Codes abzumalen.
In dem Zuge habe ich dann einige Übungsaufgaben gemacht und jetzt bei einer (wie ich dachte) Kleinigkeit, bin ich hängen geblieben. Thema sind grad die ersten Schritte mit Klassen, Methoden, etc. ... Die Klasse zur Übung habe ich geschrieben, lässt sich kompilieren. Die Methoden... nach ein paar Fehlern auch.
Dann ging es an das "Hauptprogramm" um die Klasse zu testen. ... joa... Ein Hauptmenü erstellt, Auswahl über die Zahlen 1-7, die dann in einer Switchanweisung ausgewertet werden sollen. Hat - fast - geklappt. Ich hatte ein ';' am Ende der Klasse nach dem '}' vergessen... ok. Korrigiert geht immer noch nicht...
Folgender Fall:
switch (choice) { case 1: int overflow = 0; /* ... */ break; case 2: /* ... */ break; /* ... */ }Ergebnis davon:
Visual C++ 2008 EE schrieb:
error C2360: Initialisierung von 'overflow' durch 'case'-Marke übersprungen
Hmm... ok... sehe ich ein - oder auch nicht. Weil die Variable nirgends mehr benutzt wird, nur an genau dieser einen Stelle, bzw. auch später aber halt innerhalb (oder wie sagt man in diesem Fall?) der selben case-Marke, danach nicht mehr.
Trotzdem... noch ein schneller Test und alles wirklich lokal deklariert:switch (choice) { case 1: { int overflow = 0; /* ... */ } break; case 2: { /* ... */ } break; /* ... */ }Das geht dann. Nachvollziehbar, schließlich sind die Variablen wirklich lokal und ein Überspringen bewirkt, dass es sie quasi nicht gibt - so hab ich mir das jetzt mal erklärt. Aber die Neugier siegt, so unmöglich fand ich meinen ersten Ansatz nicht, also... msdn gecheckt, vielleicht geht das ja compiler-technisch nicht. Und msdn weiss natürlich mehr:
msdn schrieb:
Declarations can appear at the head of the compound statement forming the switch body, but initializations included in the declarations are not performed. The switch statement transfers control directly to an executable statement within the body, bypassing the lines that contain initializations.
Hö? Geht also doch?
Testlauf:switch (choice) { case 1: int overflow; overflow = 0; /* ... */ break; case 2: /* ... */ break; /* ... */ }Das geht...
... und führt nun endlich zu meiner Frage: Warum kann ich deklarieren und initialisieren nicht in einem Zug? Bzw. - wenn das halt nicht erlaubt ist, warum kann ich es in zwei direkt aufeinanderfolgenden Anweisungen?Was ist der Unterschied, bzw. der signifikante Unterschied zwischen
case 1: int overflow = 0;und
case 1: int overflow; overflow = 0;Für mich macht es halt keinen Unterschied, jedenfalls nicht, was das Überspringen per case-Marke angeht. Aber Fall 1 sorgt für einen Fehler, Fall 2 lässt sich kompilieren.
Das Programm läuft jetzt ja, habe die "Klammer-Technik" (lokal scope?) verwendet. Irgendwo habe ich mal gelesen, dass man Variablen erst direkt vor der Verwendung erzeugen sollte ("global" vor der switch-Anweisung ginge natürlich auch), was meiner Meinung nach schon irgendwie Sinn macht, auch wenn es für mich ungewohnt ist und ich zwei Zeilen für eine Variable ...unschön finde (persönliche Meinung, unbegründet).
Ich wäre dankbar, wenn mir das Rätsel einer lösen könnte, also warum es in Fall 1 nicht geht, während Fall 2 funktioniert.
-
Das ist kein Problem, bei mir geht es.
C::B mit MinGW.#include <iostream> using namespace std; int main() { int i = 0, aus = 0; switch (i) { case 0 : int a = 10; aus = a; break; } cout << aus << endl; return 0; }