mktr8591 #: Um es klar zu machen, es ist nur für statische (hier geht es um C++). Bei lokalen Variablen gibt es kein Nullsetzen, wenn es einen Benutzer-Cursor gibt.
Mir hat die Erklärung selbst gefallen, die in keiner Weise im Widerspruch zu OOP steht.
Wenn Sie ein einfaches Strukturobjekt erstellen, geschieht Folgendes:
Für die Struktur wird Speicher zugewiesen - jeglicher Müll wird dort abgelegt.
Der Konstruktor wird an diesem Stück gestartet.
Wenn die Deklaration durch {} geht, wird eine weitere zwischen den Positionen 1-2 eingefügt, wodurch der zugewiesene Speicher mit Nullen gefüllt wird.
Unter dieser Logik leidet die OOP in keiner Weise. Es ist ein gültiger Mechanismus.
Für union initialisieren Sie nur das erste Mitglied, tauschen Sie die Felder aus und der Test wird ausgeführt. Überlegen wir, ob es sich lohnt, das Verhalten so zu ändern, dass es den Erwartungen der meisten Nutzer entspricht.
Nehmen wir an, ich habe etwas geändert - jetzt prüfe ich den 1. Term auf x[i].i == 0 (vorher war die Bedingung x[i].x == 0.0)
union X {
int i;
double x;
};
voidOnStart()
{
X x[10000] = {}; //(*)bool b = true;
for ( int i = 0; i < ArraySize(x) && (b = (x[i].i == 0)); i++ );
Print( b );
}
Dieses ganze Durcheinander besteht nur darin, ein Semikolon an das Ende eines Makros zu setzen. Ich verwende überall geschweifte Klammern in Makros und habe damit keine Probleme.
ZS: Ich habe auch Makros gesehen wie
Das verstehe ich nicht.
Das verstehe ich nicht.
Es gibt viele Informationen online über die Bequemlichkeit eines solchen Makros, googeln Sie "macro while 0"
https://russianblogs.com/article/9410298326/
In diesem Thread gab es vor langer Zeit ein Beispiel für while(0)
https://www.mql5.com/ru/forum/170952/page141#comment_12897922
Um es klar zu machen, es ist nur für statische (hier geht es um C++). Bei lokalen Variablen gibt es kein Nullsetzen, wenn es einen Benutzer-Cursor gibt.
Mir hat die Erklärung selbst gefallen, die in keiner Weise im Widerspruch zu OOP steht.
Wenn Sie ein einfaches Strukturobjekt erstellen, geschieht Folgendes:
Wenn die Deklaration durch {} geht, wird eine weitere zwischen den Positionen 1-2 eingefügt, wodurch der zugewiesene Speicher mit Nullen gefüllt wird.
Unter dieser Logik leidet die OOP in keiner Weise. Es ist ein gültiger Mechanismus.
Wenn {} deklariert wird, wird zwischen den Punkten 1-2 ein weiterer eingefügt, wodurch der zugewiesene Speicher mit Nullen gefüllt wird.
Unter dieser Logik leidet die OOP in keiner Weise. Gültiger Mechanismus.
Die Logik leidet hier: Warum müssen wir es auf Null setzen, wenn es danach sowieso einen Konstruktor gibt?
Die Logik selbst leidet hier: Warum Nullen, wenn es danach sowieso einen Konstruktor gibt?
Denn eine Struktur mit einem Konstruktor kann nicht in einer Union verwendet werden.
Für union initialisieren Sie nur das erste Mitglied, tauschen Sie die Felder aus und der Test wird ausgeführt.
Überlegen wir, ob es sich lohnt, das Verhalten so zu ändern, dass es den Erwartungen der meisten Nutzer entspricht.
Nehmen wir an, ich habe etwas geändert - jetzt prüfe ich den 1. Term auf x[i].i == 0 (vorher war die Bedingung x[i].x == 0.0)
Ergebnis: false
Und mit ZeroMemory - wahr
Es gibt viele Informationen online über die Bequemlichkeit eines solchen Makros, googeln Sie "macro while 0"
https://russianblogs.com/article/9410298326/
Dieses ganze Durcheinander besteht nur darin, ein Semikolon an das Ende eines Makros zu setzen. Ich verwende überall geschweifte Klammern in Makros und habe damit keine Probleme.
Nehmen wir an, ich habe etwas geändert - jetzt prüfe ich den 1. Term auf x[i].i == 0 (vorher war die Bedingung x[i].x == 0.0)
Ergebnis: false
Und mit ZeroMemory - wahr.
Ja. mql-Fehler
(und in C++ gibt sie true zurück).