Ich wette, gutes Geld falseist dasselbe wie 0(sonst if(false)würde es nicht als falsch bewertet), also wird das, was Sie haben, wahrscheinlich auf 99% der Compiler funktionieren. Ich kann mir über die anderen 1% nicht sicher sein, bis wir den Standard zitieren.
Chris Lutz
Ich weiß , dass in C, int a[10] = { 1, 2, 3 };wird eingestellt a[3]..a[9]auf 0( „implizit das gleiche wie Objekte initialisiert , die statische Speicherdauer haben“). Gilt das für C ++?
Alok Singhal
5
Ja tut es. Wenn dies für C ++ nicht zutreffen würde, wäre C ++ nicht einmal remote abwärtskompatibel mit C.
Chris Lutz
2
falseist nicht dasselbe wie 0, aber in {0}0 wird in konvertiert false, und in (für C ++) müssen {}Sie sich nicht einmal um Konvertierungen kümmern: Es wird auf falseoder 0oder Nullzeiger oder einen anderen typsensitiven Standard initialisiert .
Johannes Schaub - litb
Antworten:
139
Ja, diese Form der Initialisierung wird von allen C ++ - Compilern unterstützt. Es ist Teil der C ++ - Sprache. Tatsächlich ist es eine Redewendung, die aus der C-Sprache zu C ++ kam. In der Sprache C = { 0 }ist ein idiomatischer universeller Nullinitialisierer . Dies ist auch in C ++ fast der Fall.
Da dieser Initializer universell ist, boolbenötigen Sie für Arrays keine andere "Syntax". 0funktioniert also auch als Initialisierer für den boolTyp
bool myBoolArray[ARRAY_SIZE] = { 0 };
wird garantiert, um das gesamte Array mit zu initialisieren false. Ebenso gut wie
char* myPtrArray[ARRAY_SIZE] = { 0 };
Es wird garantiert, dass das gesamte Array mit Nullzeigern vom Typ initialisiert wird char *.
Wenn Sie glauben, dass es die Lesbarkeit verbessert, können Sie es auf jeden Fall verwenden
Aber der Punkt ist, dass die = { 0 }Variante genau das gleiche Ergebnis liefert .
In C ++ = { 0 }funktioniert dies jedoch möglicherweise nicht für alle Typen, z. B. Aufzählungstypen, die nicht mit Integral initialisiert werden können 0. C ++ unterstützt jedoch die kürzere Form
T myArray[ARRAY_SIZE] = {};
dh nur ein leeres Paar {}. Dadurch wird ein Array eines beliebigen Typs standardmäßig initialisiert (vorausgesetzt, die Elemente erlauben eine Standardinitialisierung). Dies bedeutet, dass für grundlegende (skalare) Typen das gesamte Array ordnungsgemäß auf Null initialisiert wird.
Wenn ich auf meinem Compiler (qt Creator 2.4.1 - qt Version 4.8.0) schreibe, wird bool myBoolArray[ARRAY_SIZE] = { false };das Array auf false initialisiert, aber wenn ich schreibe, wird bool myBoolArray[ARRAY_SIZE] = { true };nur das erste Element auf true gesetzt, während alles andere auf false gesetzt ist. Irgendeine Erklärung?
Rookie Coder
@rookie coder: Erklärung für was genau? Was erwarten Sie, sollte passieren? Wenn Sie in C ++ ein Array teilweise initialisieren bool, wird der Rest für Sie mit Null initialisiert. So ist es nun einmal.
AnT
1
@AndreyT Gut, aber ich finde dieses Verhalten zumindest kontraintuitiv. Wenn ich nicht initialisiere, bool myBoolArray[ARRAY_SIZE];enthält das Array zu Recht zufällige Werte, daher hätte ich nicht erwartet, dass eine Initialisierung ein Array mit anderen Werten zurückgeben könnte. Das ist alles.
Rookie Coder
1
@AndreyT: sicher, aber ich hätte nie gedacht, dass die Lawine anders gewesen wäre als das erste Element ;-) Trotzdem danke für die Infos!
Rookie Coder
18
Beachten Sie, dass das '=' in der universellen Initialisierungssyntax von C ++ 11 optional ist und allgemein als besserer Schreibstil angesehen wird:
Ja, ich glaube, es sollte funktionieren und es kann auch auf andere Datentypen angewendet werden.
Wenn für Klassenarrays weniger Elemente in der Initialisierungsliste als Elemente im Array enthalten sind, wird der Standardkonstruktor für die verbleibenden Elemente verwendet. Wenn für die Klasse kein Standardkonstruktor definiert ist, muss die Initialisiererliste vollständig sein, dh für jedes Element im Array muss ein Initialisierer vorhanden sein.
Sie können das Array in C ++ auf diese Weise deklarieren. Wenn Sie die Arraygröße kennen, sollten Sie das Array für
Folgendes deklarieren: Ganzzahl: int myArray[array_size];
Double: double myArray[array_size];
Zeichen und Zeichenfolge: char myStringArray[array_size];Der Unterschied zwischen Zeichen und Zeichenfolge ist wie folgt
false
ist dasselbe wie0
(sonstif(false)
würde es nicht als falsch bewertet), also wird das, was Sie haben, wahrscheinlich auf 99% der Compiler funktionieren. Ich kann mir über die anderen 1% nicht sicher sein, bis wir den Standard zitieren.int a[10] = { 1, 2, 3 };
wird eingestellta[3]..a[9]
auf0
( „implizit das gleiche wie Objekte initialisiert , die statische Speicherdauer haben“). Gilt das für C ++?false
ist nicht dasselbe wie0
, aber in{0}
0 wird in konvertiertfalse
, und in (für C ++) müssen{}
Sie sich nicht einmal um Konvertierungen kümmern: Es wird auffalse
oder0
oder Nullzeiger oder einen anderen typsensitiven Standard initialisiert .Antworten:
Ja, diese Form der Initialisierung wird von allen C ++ - Compilern unterstützt. Es ist Teil der C ++ - Sprache. Tatsächlich ist es eine Redewendung, die aus der C-Sprache zu C ++ kam. In der Sprache C
= { 0 }
ist ein idiomatischer universeller Nullinitialisierer . Dies ist auch in C ++ fast der Fall.Da dieser Initializer universell ist,
bool
benötigen Sie für Arrays keine andere "Syntax".0
funktioniert also auch als Initialisierer für denbool
Typbool myBoolArray[ARRAY_SIZE] = { 0 };
wird garantiert, um das gesamte Array mit zu initialisieren
false
. Ebenso gut wiechar* myPtrArray[ARRAY_SIZE] = { 0 };
Es wird garantiert, dass das gesamte Array mit Nullzeigern vom Typ initialisiert wird
char *
.Wenn Sie glauben, dass es die Lesbarkeit verbessert, können Sie es auf jeden Fall verwenden
bool myBoolArray[ARRAY_SIZE] = { false }; char* myPtrArray[ARRAY_SIZE] = { nullptr };
Aber der Punkt ist, dass die
= { 0 }
Variante genau das gleiche Ergebnis liefert .In C ++
= { 0 }
funktioniert dies jedoch möglicherweise nicht für alle Typen, z. B. Aufzählungstypen, die nicht mit Integral initialisiert werden können0
. C ++ unterstützt jedoch die kürzere Formdh nur ein leeres Paar
{}
. Dadurch wird ein Array eines beliebigen Typs standardmäßig initialisiert (vorausgesetzt, die Elemente erlauben eine Standardinitialisierung). Dies bedeutet, dass für grundlegende (skalare) Typen das gesamte Array ordnungsgemäß auf Null initialisiert wird.quelle
bool myBoolArray[ARRAY_SIZE] = { false };
das Array auf false initialisiert, aber wenn ich schreibe, wirdbool myBoolArray[ARRAY_SIZE] = { true };
nur das erste Element auf true gesetzt, während alles andere auf false gesetzt ist. Irgendeine Erklärung?bool
, wird der Rest für Sie mit Null initialisiert. So ist es nun einmal.bool myBoolArray[ARRAY_SIZE];
enthält das Array zu Recht zufällige Werte, daher hätte ich nicht erwartet, dass eine Initialisierung ein Array mit anderen Werten zurückgeben könnte. Das ist alles.Beachten Sie, dass das '=' in der universellen Initialisierungssyntax von C ++ 11 optional ist und allgemein als besserer Schreibstil angesehen wird:
char myarray[ARRAY_SIZE] {0}
quelle
Ja, ich glaube, es sollte funktionieren und es kann auch auf andere Datentypen angewendet werden.
Wenn für Klassenarrays weniger Elemente in der Initialisierungsliste als Elemente im Array enthalten sind, wird der Standardkonstruktor für die verbleibenden Elemente verwendet. Wenn für die Klasse kein Standardkonstruktor definiert ist, muss die Initialisiererliste vollständig sein, dh für jedes Element im Array muss ein Initialisierer vorhanden sein.
quelle
Sie können das Array in C ++ auf diese Weise deklarieren. Wenn Sie die Arraygröße kennen, sollten Sie das Array für Folgendes deklarieren: Ganzzahl:
int myArray[array_size];
Double:double myArray[array_size];
Zeichen und Zeichenfolge:char myStringArray[array_size];
Der Unterschied zwischen Zeichen und Zeichenfolge ist wie folgtchar myCharArray[6]={'a','b','c','d','e','f'}; char myStringArray[6]="abcdef";
Wenn Sie die Größe des Arrays nicht kennen, sollten Sie das Array wie folgt leer lassen.
ganze Zahl:
int myArray[array_size];
Doppelt:
double myArray[array_size];
quelle