Frage

Ich habe einen Fehler in meinem aktuellen Code haben, dass ich meinen Kopf worden hämmern gegen für ein paar Tage. Ich werde die Zusammenfassung Version des Codes unten schreiben (nicht meinen eigentlichen Code, aber es kompiliert noch).

#include <iostream>

using namespace std;

int main()
{
  int x = 7;

  switch(x)
  {
    case 1:
    {
      case 2:
      cout << "hi";
    }
  }
}

Ich mag manchmal einführen einen engeren Rahmen meiner Schalter Fällen so lokale Variablennamen nicht stören, die ich früher benutzt habe. Anscheinend hatte ich einen Anruf zu beantworten oder Tag etwas ein und beenden Sie nicht die Case-Anweisung zu schreiben, wie ich wollte, aber später war sicher, dass ich hatte. Fall 2 sollte in einem verschachtelten Schalter hat, nicht als Teil des ursprünglichen outter Schalters (für diejenigen fragen, verwende ich Konstanten in meinem Code genannt, nicht nur magische Zahlen) tatsächlich gewesen. Auf g ++, habe ich nicht eine Warnung oder einen Fehler, wenn ohne Optionen compling.

Meine Frage: Warum erlauben Quer Umfang Fall von einem Schalter springt? Welchem ??Zweck dient sie?

War es hilfreich?

Lösung

Duff Gerät ist kaum der „Zweck“ der Quer Umfang Fall Etikett wie bereits angedeutet, es ist lediglich eine Ausbeutung davon.

Die Wahrheit ist wahrscheinlich, dass es nicht dient absichtlich entworfen Zweck, sondern ist lediglich ein Artefakt der einfachsten möglichen Implementierung, die funktioniert. Das Design ist so, dass das Schalter-case-Konstrukt kann genau das tun, was vernünftig ist, ist aber nicht explizit schützen Sie von dem unvernünftigen auch nicht.

Andere Tipps

Die Fall Etiketten sind nur Etiketten, Ziele (Compiler generiert) gotos.

In der gleichen Weise wie gewöhnliche Etiketten Funktionsumfang haben, Fall Etiketten switch Umfang haben.

Der einzige vernünftige Vorteil ist, Duff Geräte , die aber nicht sehr relevant für moderne Computer.

Also, es ist historisch.

Ein Fall von "frozen Geschichte".

Prost & hth.

Dieser Code kompiliert aus historischen Gründen nur.

Beachten Sie, dass es sehr bizarr verursachen könnte Versionen von nicht definiertes Verhalten :

// don't try this at home
switch(x) {
  case 1:
  {
    std::string s = "hi!"
    case 2:
    cout << s; // doh!
  }
}

Wenn x==2, würde dies s zugreifen, ohne den Konstruktor ersten Aufruf. Ich würde erwarten, dass Compiler darüber zu warnen, though.

Cross-scope Fall Beschriftungen in Switch-Anweisungen einen Zweck dienen, insbesondere in Echtzeit, Embedded, Systemanwendungen. Zum einen ermöglichen sie sauberere Implementierungen von couroutines . Sie verringern oder beseitigen auch die Verwendung von GOTO-Anweisungen in ähnlichen Low-Level-Anwendungen. Ja, sind Gotos hässlich, aber wenn Sie Gerätetreiber vor, wo die Zeit und Synchronisierungsprobleme sind die Norm geschrieben haben, würden Sie den Nutzen von Cross-scope Fall Etiketten über die hohe Wartung von GOTO-Anweisungen zu schätzen wissen. Die kleinere Übel, wenn man so will.

Ihr Code oben ist ein Synonym für:

switch (x)
{
     case 1:
     case 2:
     cout << "hi";
}

Der Compiler unterscheidet nicht zwischen diesem Code und dem Code, den Sie in Bezug auf den Switch-Case-Funktionalität geschrieben. Es ist es als mehrere Case-Szenarien für die Befehle zu interpretieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top