2012-04-25 67 views
7

Vorrei sapere se v'è una differenza tra:Qual è la differenza tra {0} e ""?

char s[32] = ""; 

e:

char s[32] = {0}; 

Grazie.

+0

La risposta è stata data. Ma nel caso dovessi pensare ora non c'è differenza tra '{0}' e '" "', prova questo con altri tipi, ad esempio, 'int'sarray invece di' char' array. Allora vedrai la differenza. –

risposta

18

No non v'è alcuna differenza tra i due dichiarazioni:

char bla[32] = {0}; 

and 

char bla[32] = ""; 

Vedere il relativo paragrafo del C standard (sottolineatura mia):

(C99, 6.7.8p21) "Se ci sono un minor numero di inizializzatori in un elenco racchiuso di parentesi graffe rispetto a elementi o membri di un aggregato, o un numero inferiore di caratteri in una stringa letterale utilizzata per inizializzare un array di dimensioni note rispetto a quelli presenti nell'array, il resto dell'aggregato deve essere inizializzato implicitamente il s come oggetti con durata di archiviazione statica. "

+0

Ok, grazie mille! – md5

+1

Cioè, finchè ''\ 0' == 0'. – Philip

+2

@Philip Non ho una citazione dallo standard, ma ecco cosa dice K & R 2nd * "La costante di carattere '\ 0' rappresenta il carattere con valore zero, il carattere null. '\ 0' è spesso scritto invece di 0 per enfatizzare la natura del carattere di qualche espressione, ma il valore numerico è solo 0. "* – ouah

10

In tal caso, non c'è alcuna differenza, sia inizializzare tutti gli slot della matrice a 0. In generale, "" funziona solo per char array (con o senza modifiche come const o unsigned), ma {0} opere per matrici di tutti numerici tipi.

Nella sezione 6.7.9 della norma (n1570), punto 21 legge

Se ci sono meno inizializzatori in una lista tra graffe racchiuso che ci sono elementi o membri di un aggregato o meno caratteri in una stringa letterale utilizzata per inizializzare una matrice di dimensioni note rispetto a quelle presenti nell'array, la parte restante dell'aggregato deve essere inizializzata implicitamente come oggetti con durata di archiviazione statica.

quindi anche "" inizializza l'array completo.

+0

+1 '{0}' funziona per qualsiasi tipo di dati che può avere un inizializzatore. D'altra parte non * è consentito per tutti gli array, vale a dire non per VLA, poiché questi non devono avere gli inizializzatori. –

2

Il risultato di entrambe le espressioni è lo stesso: una stringa vuota. Tuttavia, il primo è più esplicito, quindi più leggibile.

2

Non c'è differenza. Puoi anche vedere di persona! Questa è la risposta più affidabile che puoi ottenere. Basta usare un debugger. Esegui le due linee e confronta il risultato. Ma dovresti rinominare gli array. Io uso gcc/gdb e compilare il seguente codice

int main(int argc, char* argv[]) 
{ 
    char s[5] = {0}; 
    char t[5] = ""; 
    return 0; 
} 

via test.c gcc -g e quindi richiamare gdb a.out. In gdb metto il

break 5 
run 
print s 

l'ultima affermazione si risponde con gdb con il seguente risultato:

$1 = "\000\000\000\000" 

continuo ed entro "t stampa" e ottenere di conseguenza

$2 = "\000\000\000\000" 

che racconta io che con il mio compilatore di scelta entrambe le affermazioni danno lo stesso risultato.

+3

Matthias: questo non è il metodo più affidabile, poiché qualsiasi comportamento non definito può variare tra le implementazioni del compilatore o a causa delle differenze nel contenuto della memoria non inizializzata .... –

+0

@ tony-delroy ho chiarito e spero di aver reso il mio punto più chiaro (non ho Però è davvero il tuo ...) – Matthias

+1

il mio punto è che sapere cosa fa il tuo programma in una particolare esecuzione non dimostra che lo standard C++ richiede che qualsiasi eseguibile generato da quel codice sorgente sia fatto da qualsiasi compilatore C++. Se si desidera un codice affidabile, attenersi a ciò che garantisce lo standard, in quanto il comportamento del programma osservabile può variare. Ad esempio, se leggi da una variabile non inizializzata - 'int x; std :: cout << x << '\ n'; '- potresti vedere il numero che ti aspetti per caso (specialmente se ti aspetti uno 0), ma rieseguire il programma, o ricompilarlo, e potresti ottenere un risultato diverso ... –

2

Oltre a quanto già detto:

char s[32] = ""; 

=

char s[32] = {'\0'}; 

=

char s[32] = {0}; 

=

char s[32] = {0, 0, 0, /* ...32 zeroes here*/ ,0 }; 

Tutti questi comporteranno esattamente lo stesso codice macchina: un array di 32 byte riempito con tutti gli zeri.

Problemi correlati