![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Welchen Sinn hat es also, default:return(false ) anzugeben, wenn die Variable zum Typ bool gehört, der im Prinzip nur zwei Werte hat, von denen beide in der switch-Anweisung verwendet werden? Mit anderen Worten: Das Standardetikett sollte überhaupt nicht ausgeführt werden.
P.S. 1. Wenn wir Ihrem Ansatz folgen, wird die Standardbeschriftung außerdem obligatorisch statt optional.
2. Break-Operatoren sind in beiden Fällen bedeutungslos.
Der switch-Operator wandelt Ihre bool_var in einen Integer-Typ um.
Und der Compiler muss nicht wissen, dass diese Variable zwei Werte hat. Es geht nicht darum, den Algorithmus logisch zu analysieren.
Sie vergessen noch etwas - jede Variable kann einen ungültigen Wert haben oder nicht initialisiert sein (einen "unsinnigen" Wert haben)...
Das vergesse ich nicht. In meinem Beispiel wurde die Variable also initialisiert. Trotzdem erzeugte der Compiler einen Fehler.
Das Beispiel mitbool_var=-1ist extrem falsch. Überzeugen Sie sich selbst davon:
Die switch-Anweisung wandelt Ihre bool_var in einen Integer-Typ um.
Und der Compiler braucht nicht zu wissen, dass diese Variable zwei Werte hat. Der Algorithmus wird nicht logisch analysiert.
Übrigens gibt es bei Booleschen Variablen eine glückliche Variante, wenn eine nicht initialisierte Variable oder eine Variable mit dem Wert -1 z. B. in true/false umgewandelt wird.
Dies ist natürlich nicht der Fall, wenn Sie die Variable ausdrücklich als int deklarieren.
Das vergesse ich nicht. Aus diesem Grund wurde die Variable in meinem Beispiel initialisiert. Trotzdem erzeugte der Compiler einen Fehler.
Das Beispiel mitbool_var=-1ist extrem falsch. Überzeugen Sie sich selbst:
Ich bin bereits davon überzeugt, und deshalb habe ich es entfernt. Aber das ist ein zufälliges Glück (betrachten Sie es als eine Eigenschaft der Sprache).
Aber bei der Behandlung eines möglichen Fehlers in einem Switch-Block muss der Compiler nicht herausfinden, was und wie dort eingegeben wird, also behandelt er es als Fehler und nicht als Warnung.
Und der Compiler braucht nicht zu wissen, dass diese Variable zwei Werte hat. Es wird keine logische Analyse des Algorithmus durchgeführt.
Sie meinen also, dass der Compiler die Liste der Werte in der Aufzählung und deren Gesamtzahl nicht berücksichtigt?
Aber bei der Verarbeitung eines möglichen Fehlers in einem Switch-Block muss der Compiler nicht herausfinden, was und wie er eingegeben wird, so dass der Compiler ihn als Fehler und nicht als Warnung behandelt.
1. bool ist bereits ein "Integer-Typ". Oder wollen Sie sagen, dass switch eine Konvertierung in einen höheren Ganzzahlentyp ist.
2) Wollen Sie damit sagen, dass der Compiler die Liste der Enum-Werte und deren Gesamtzahl nicht berücksichtigt?
1. bool ist ein Integer-Typ mit der Größe von einem Byte. Die Konvertierung erfolgt in den Typ int, das stimmt.
2. Auch hier sind Sie richtig. Nur case ist keine Aufzählung, sondern nur eine Bezeichnung für eine bedingte Verzweigung.
1. bool ist ein ganzzahliger Typ mit einem Byte. Die Umwandlung erfolgt in den Typ int, Sie haben Recht.
Laut Handbuch ist bool ein besonderer Typ, der nicht zu den Ganzzahlen gehört... Deshalb habe ich meine falsche Aussage gelöscht. Aber ich will nicht widersprechen - ich bin kein Experte.
Dima_S:
Sie meinen also, dass der Compiler die Liste der Werte aus der Aufzählung und deren Gesamtzahl nicht berücksichtigt?
2. Sie haben es auch hier richtig geschrieben. Nur case ist keine Aufzählung, sondern nur eine Bezeichnung für eine bedingte Verzweigung.
Ich meinte Aufzählungen (wobei der Typ bool der kleinste ist), nicht Großbuchstaben. Hier ist ein Beispiel mit demselben Kompilierungsfehler:
Ich wiederhole also meine Frage zu diesem Beispiel: Meinen Sie, dass der Compiler die Liste der Werte aus der Triple-Aufzählung und ihre Gesamtzahl nicht berücksichtigt? Ich habe alle Aufzählungswerte im Switch-Operator verwendet.
Das Zwischenfazit lautet: Die Verwendung des Standard-Labels wird obligatorisch, wenn die Aufzählung+Schalter?
Stellen wir uns das so vor (übrigens funktioniert der Wert 3 nicht bei expliziter Deklaration eines Wertes, aber -1 schon). Aber das Fehlen einer expliziten Variableninitialisierung wird zeigen, dass der Wert gleich dem Wert mit Index 0 ist (all dies ist gut durchdacht).
Was soll die Funktion zurückgeben, wenn die Standardoption ausgeschlossen ist?
Das Zwischenfazit lautet: Die Verwendung des Standard-Labels wird obligatorisch, wenn die Aufzählung+Schalter?
ja, wenn in return() etwas zurückgegeben werden muss.
oder zumindest so, dass der Compiler sicher sein kann, dass die Funktion etwas zurückgibt: