2012-10-08 14 views
13

Eventuali duplicati:
C and C++ : Partial initialization of automatic structureC++ galleggiare inizializzazione serie

Durante la lettura Code Complete, mi sono imbattuto in un C++ esempio di inizializzazione array:

float studentGrades[ MAX_STUDENTS ] = { 0.0 }; 

non l'ho fatto sapere C++ potrebbe inizializzare la e serie ntire, così ho provato:

#include <iostream> 
using namespace std; 

int main() { 
    const int MAX_STUDENTS=4; 
    float studentGrades[ MAX_STUDENTS ] = { 0.0 }; 
    for (int i=0; i<MAX_STUDENTS; i++) { 
     cout << i << " " << studentGrades[i] << '\n'; 
    } 
    return 0; 
} 

Il programma ha dato i risultati sperati:

0 0 
1 0 
2 0 
3 0 

ma cambiando il valore di inizializzazione da 0.0, per dire, 9.9:

float studentGrades[ MAX_STUDENTS ] = { 9.9 }; 

Ha dato il risultato interessante:

0 9.9 
1 0 
2 0 
3 0 

La dichiarazione di inizializzazione ha impostato solo il primo elemento dell'array?

risposta

21

Se si utilizza qualsiasi cosa tranne le parentesi graffe vuote, si inizializzano solo le prime posizioni N su quel valore e tutte le altre sono inizializzate su 0. In questo caso, N è il numero di argomenti passati all'elenco di inizializzazione, ovvero

float arr1[10] = { };  // all elements are 0 
float arr2[10] = { 0 };  // all elements are 0 
float arr3[10] = { 1 };  // first element is 1, all others are 0 
float arr4[10] = { 1, 2 }; // first element is 1, second is 2, all others are 0 
+0

Non dimenticare che è possibile utilizzare un elenco di inizializzazione vuoto, nel qual caso * tutti gli elementi * sono impostati su zero. –

+0

@MarkRansom: Sì sì, lo aggiungo, grazie. –

+0

Lo fai sembrare come 0 è un caso speciale, ma non lo è. Sta impostando il primo elemento a 0 e poi il resto a 0. –

5

No, imposta tutti i membri/elementi che non sono stati impostati in modo esplicito sul loro valore di inizializzazione predefinito, che è zero per i tipi numerici.