Fehler, Irrtümer, Fragen - Seite 2860

 
Ist dieses Verhalten des Compilers korrekt?
class A
{
public:
  static int i;
  
  static int f()
  {
    A::i = 123;
    
    return(A::i);
  }
};

static int A::i = A::f();

void OnStart()
{
  Alert(A::i); // 123
}
Es scheint, dass A::i nicht erstellt wird, wenn die Methode A::f() aufgerufen wird, die A::i aufruft.
 
fxsaber:
Ist dieses Verhalten des Compilers korrekt? Es scheint, dass A::i zum Zeitpunkt des Aufrufs der Methode A::f(), die A::i aufruft, nicht erstellt wird.

Was ist mit "geschaffen" gemeint?

static ist nur eine Möglichkeit , einen Rake zu erstellen, um eine globale Variable oder Funktion zu verstecken und die Sichtbarkeit einer Funktion oder Klasse einzuschränken

. Der Speicher für eine globale Variable ist immer vorhanden.
Und ja, für globale Variablen ist die Initialisierungsreihenfolge sehr wichtig (ich meine, vermeiden Sie den Zugriff auf die Variable, bevor sie initialisiert ist)
Dieses Beispiel funktioniert...

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 
Ilyas:

Im obigen Beispiel hat es funktioniert...

Werden Sie den Compiler an dieser Stelle ändern? Ich persönlich würde es gerne so belassen, wie es ist.

 
fxsaber:

Werden Sie den Compiler an dieser Stelle ändern? Ich persönlich würde gerne alles so belassen, wie es ist.

Wir haben nicht vor, das Verhalten zu ändern.

Aber es gibt eine aufgeschobene Aufgabe der Erkennung von Fehlern beim Zugriff auf globale Variablen (vor der Initialisierung).
Wenn wir diese Funktion implementieren, erhalten wir beim Kompilieren des obigen Codes eine Warnung: die Funktion A::f() wird zur Initialisierung von A::i verwendet, die auf die zu initialisierende Variable A::i zugreift.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
Ilyas:

Wenn wir die Funktion implementieren, erhalten Sie beim Kompilieren des obigen Codes eine Warnmeldung: Die Funktion A::f() wird zur Initialisierung von A::i verwendet, die auf die zu initialisierende Variable A::i zugreift.

Ich danke Ihnen!

 
Ilyas:

Wir haben nicht vor, das Verhalten zu ändern

Dann widerspricht es Ihrem Konzept, dass eine Variable als deklariert gilt, wenn die Deklaration vollständig ist. Warum haben Sie es überhaupt erfunden? Wenn es in einem Fall so und in einem anderen Fall anders ist

int i = i; //Error: 'i' - undeclared identifier
Eine gute Sprache hat einheitliche Regeln, nicht umgekehrt
 
A100:

Dann widerspricht es Ihrem eigenen Konzept, dass eine Variable als deklariert gilt, wenn die Deklaration vollständig ist. Warum haben Sie es überhaupt erfunden? Wenn es in einem Fall so und in einem anderen Fall anders ist

Eine gute Sprache hat einheitliche Regeln, nicht umgekehrt

Ich bin ein totaler Ignorant, aber ich wäre nicht darauf gekommen (int i = i), selbst wenn ich zu viel getrunken hätte....... 8(

 
Сергей Таболин:

Ich bin ein totaler Ignorant, aber auf diese Idee (int i = i) wäre ich nicht gekommen, selbst wenn ich zu viel getrunken hätte....... 8(

Und was ist der Hauptunterschied zum ursprünglichen Beispiel? Entfernen Sie Unnötiges und Sie werden es bekommen:

int i = i = 123; //Error: 'i' - undeclared identifier

Nur dass es dort viele Fäden gibt, hier aber nur einen.

Wenn es keinen Kompilierungsfehler gibt, sollte es hier auch keinen geben (und umgekehrt), sonst ist es ein Chaos

 
A100:

Dann widerspricht es Ihrem eigenen Konzept, dass eine Variable als deklariert gilt, wenn die Deklaration vollständig ist. Warum haben Sie es überhaupt erfunden? Wenn es in einem Fall so und in einem anderen Fall anders ist

Eine gute Sprache hat einheitliche Regeln, nicht umgekehrt
In diesem Fall ist es in Ordnung.

Der Punkt ist, dass man unter anderen, schwierigeren Bedingungen ein undefiniertes Verhalten erreichen kann. Self-Shots in C++ sind implementierbar.
 
A100:

Was ist der grundlegende Unterschied zum ursprünglichen Beispiel? Nimm das zusätzliche Zeug weg und du hast es:

Nur gibt es dort viele Linien und hier nur eine

Wenn es keinen Kompilierungsfehler gibt, sollte es hier auch keinen geben (und umgekehrt), sonst ist es ein Chaos.

Sie irren sich, das ist nicht dasselbe.

Die Beschreibung einer statischen Variablen in einer Klasse ist ihre Vordefinition (ähnlich wie die Vordefinition einer Funktion oder Klasse), aber der Speicherort teilt dem Compiler lediglich mit, wo die Variable im Speicher abgelegt wird und wann sie initialisiert werden soll