2016-03-10 16 views
6
#include <iostream> 
using namespace std; 

int main() { 
    int arr[10] = {}; 
    for(auto element : arr) 
    { 
     cout<<element<<" "; 
    } 
    cout<<endl; 
} 

wenn i int arr[10] = {} schreiben, sind die Elemente in allen arr0. aber wenn ich nur int arr[10] write, sind die Elemente in arr zufällig. So bin ich verwirrt über int arr[10] = {}, ich nur ein Array int arr[10] deklarieren, aber ich gebe es keinen Wert, nur ein {}.das Array Initialisieren in C++

+0

Dies ist nur ein syntaktischer Zucker, in vielen Situationen brauchen, ist '1000' statt, Abgesehen davon, dass nur Sytax verwendet werden kann, wird das Array durchgeschleift und jedem Element manuell '0' zugewiesen. Lesen Sie mehr über Arrays [hier] (http://www.cplusplus.com/doc/tutorial/arrays/) – tchelidze

+0

Nun haben Sie eine Antwort, für Tritte, entfernen Sie die '=' (aber behalten Sie die '{}') und versuche es noch einmal. 'int arr [10] {};' – WhozCraig

+0

@WhozCraig das Ergebnis ist '0 0 0 0 0 0 0 0 0 0', das '=' ist vielleicht nutzlos, was ist der Grund? – BlackMamba

Antwort

5

wenn ich schreibe int arr [10] = {}, die Elemente in arr sind alle 0.

, die, wie die Syntax der Sprache funktioniert ist. In Ihrem Fall wird das Array Null initialisiert.

aber wenn ich nur int arr [10] wrde, sind die Elemente in arr zufällig.

In Ihrem Fall werden Array-Elemente nicht initialisiert. Sie sollten Werte von Variablen nicht lesen, die nicht initialisiert sind; Andernfalls lösen Sie ein undefiniertes Verhalten aus.

+3

tatsächlich 'int arr [10] = {};' wird * value-initialize *. 'int arr [10];' ist * default-initialize * was bedeutet, nichts für int zu tun. (Siehe [dcl.init/7]) –

+0

Funktioniert es nur für den Basistyp (int, float, dobule)? Wenn ich eine benutzerdefinierte Klasse 'Person' definiere, funktioniert' Person arr [10] = {} '? – BlackMamba

+0

@BlackMamba In diesem Fall wird die Instanz Ihres Objekts standardmäßig initialisiert - unabhängig von der Standardinitialisierung für Ihre Klasse, AFAIK. –

0

int arr[10]; nichts initialisiert wird, wird es die Zuweisung Speicherblöcke, die Größe eines int und Sie bekommen, was jemals in diesem Speicher ist.

int arr[10] = {}; wird alle int Blöcke Initialisieren Sie Array von ganzen Zahlen mit Nullen, Stellen Sie sich vor, dass die Größe des Arrays initialisiert erstellen auf null/0

+0

Das gilt für eingebaute Typen wie int, aber der Unterschied zwischen Standard und Wert für Typen mit Konstruktoren ist komplexer. –

+1

@MartinBonner, aber er verwendet ein int-Array im Beispiel und fragt, warum er alle 0 oder zufällige Daten bekommt. Fehle ich etwas?Ich verstehe, was du sagst, aber denke nicht, dass es auf die Frage zutrifft. Würde 'object arr [10] = {}' einfach den Standardkonstruktor dieser Objekte verwenden? – lciamp

+1

Wenn es einen Standardkonstruktor gibt, werden 'object arr [10] = {};' und 'object arr [10];' beide aufrufen. Wenn es sich um einen POD-Typ handelt, wird jedes Objekt im ersten Fall auf Null initialisiert und im zweiten Fall unbestimmt gelassen. –

Verwandte Themen