Wenn Sie in C / C ++ nur das erste Element eines Arrays bekannter Größe mit einem Wert initialisieren, wird der Rest mit 0 gefüllt, also:
%Vor%macht genau das, was Sie wollen.
Dies funktioniert auch für Strukturen:
%Vor%initialisiert alle Mitglieder auf 0.
Der Standard (C99 - 6.7.8 / 12 - Initialisierung) sagt dies:
Wenn in einer geschichteten Liste weniger Initialisierer vorhanden sind als Elemente oder Mitglieder eines Aggregats oder weniger Zeichen in einem Zeichenfolgenliteral, das zum Initialisieren eines Arrays mit bekannter Größe verwendet wird, als Elemente im Array vorhanden sind, wird der Rest von Das Aggregat wird implizit genauso wie Objekte mit statischer Speicherdauer initialisiert.
In C erfordert die Grammatik, dass mindestens ein 'Zuweisungsausdruck' in den geschweiften Klammern steht. Ein 'Zuweisungsausdruck' kann viele Dinge von einer Konstante oder einem Identifizierer bis zu viel komplexeren Ausdrücken umfassen. Ein leerer String ist jedoch kein "Zuweisungsausdruck", also muss etwas zwischen den geschweiften Klammern stehen.
In C ++ erlaubt die Grammatik speziell den '{}' Initialisierer, also würde das folgende auch das Array null-initialisieren:
%Vor%Es ist wahrscheinlich auch erwähnenswert, dass in C ++ die Einträge, die keinen spezifischen Initialisiererwert in der Initialisierungsliste haben, 'wertinitialisiert' oder 'default-initialisiert' sind, was von der Nullinitialisierung abhängig sein kann was die Konstruktoren für den Variablentyp sind und ob der Compiler dem C ++ 98-Standard oder dem C ++ 03-Standard folgt (dies ist wahrscheinlich der einzige Unterschied zwischen C ++ 98 und C ++ 03). Die ganze Situation mit der Initialisierung von Wert und Standard ist ziemlich kompliziert. Wenn Sie interessiert sind, sehen Sie diese Antwort: Machen die Klammern hinter dem Typnamen einen Unterschied zu neuen? .
Glücklicherweise scheint der Unterschied in der Praxis keine großen Probleme zu bereiten, wenn Sie jedoch darauf stoßen, würde es wahrscheinlich eine Weile Kopfkratzen verursachen, wenn Sie versuchen herauszufinden, wie das Verhalten wirklich sein sollte. Normalerweise denke ich nicht viel darüber nach - es macht meinen Kopf weh.
Wow, C scheint irgendwie einfach zu sein, aber selbst nach Jahren, in denen die Spezifikation zitiert wird, ist es erstaunlich, wie etwas Neues immer noch auftauchen kann.
Ich habe es gerade in der ersten Ausgabe-Spezifikation (ANSI / ISO 9899-1990) nachgeschlagen und, tatsächlich, wird der Rest eines automatischen Aggregats angegeben (6.5.7) "Wenn es weniger ... implizit initialisiert wird. .. ".
Also: Alles nicht-automatisch. Immer 0 (oder wie initialisiert) ob initialisiert oder nicht. Auto: vollständig initialisiert, wenn Sie überhaupt irgendwelche Elemente initialisieren, sonst nicht initialisiert.