Fehler, Irrtümer, Fragen - Seite 416

 
Yedelkin:

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.

 
Interesting:

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:

bool bool_var=-1;
void OnStart()
  {
   Print("bool_var=",bool_var);
  }   
 
Dima_S:

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.

Yedelkin:

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.

 
Dima_S:

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?

 
Interesting:

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.

Das Zwischenfazit lautet: Die Verwendung des Standardetiketts wird obligatorisch, wenn Aufzählungen+Schalter? verwendet werden.
 
Yedelkin:

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.

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Dima_S:

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:

Yedelkin:

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:

enum Triple
  {
   err=-1,
   no = 0,
   hay= 1
  };
Triple triple_var=err;
Triple Test(void)
  {
   switch(triple_var)
     {
      case  err: return(err);
      case   no: return(no);
      case  hay: return(hay);
      //default:return(hay);
     }
  }
void OnStart()
  {
   Test();
  }

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.

 
Yedelkin:
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?

ENUM_CHART_MODE ChartMode = -1;

string Test()
  {
   switch(ChartMode)
     {
      case 0: return("Bars"); break;
      case 1: return("CANDLES"); break;
      case 2: return("LINE"); break;      
      default: return("Unknown");
     }
  }
void OnStart()
{
Comment(Test());
}
 
Yedelkin:
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:

bool bool_var=false;
bool Test(void)
  {
   switch(bool_var)
     {
      case  true: return(true);
      case false: return(false);
     }
    return(false);//хотя до сюда ни когда не дойдем, но прописать надо
  }
void OnStart()
  {
   Test();
  }
 
Ich danke Ihnen allen für die Wissenschaft! Ich werde mit den Zähnen knirschen müssen, um zusätzliche Zeilen einzufügen :)