Buongiorno a tutti, qualcuno può spiegarmi l'eventuale differenza tra l'utilizzo delle virgolette (") e degli apici (') per racchiudere singoli caratteri in variabili tipo char?
In internet non ho trovato alcunchè di comprensibile salvo l'indicazione di usare gli apici per i singoli caratteri e le virgolette per le parole/frasi.
Ciao! In C si usano '' per i caratteri e "" per le stringhe. Quando usi "c" sono sempre due caratteri ovvero
una stringa, perché viene aggiunto il terminatore stringa è come se fosse "c\0", è comunque sempre una stringa e non un carattere.
'c' carattere
"c" stringa
Quindi non puoi scegliere devi usare i singoli apici per i caratteri
In realtà esiste un caso in cui le due scritture sono identiche. Il caso è la stringa classica ( notare la s minuscola) inizializzata con un unico carattere e di cui È nota la lunghezza. Se io infatti scrivessi
char stringa [10]='c';
Creerei una stringa di 10 caratteri il cui primo è una C minuscola e gli altri nove sono automaticamente posti a /0.
Se io invece scrivessi
char stringa [10]="c";
Avrei creato una stringa di 10 caratteri Il primo è una C minuscola il cui secondo è un /0 E i cui successivi otto sono /0 automatici.
Così almeno è come la penso io chiedo conferma. So che é un caso limite
Secondo il K&R quando inizializzando un array vengono definiti meno elementi della sua dimensione è prescritto che gli elementi restanti siano a zero, per array extern, automatic o static, e non mi sembra che in 'C' esistano altri "scope" di variabili, non conosco il C++
EDIT:
per siano a zero intendo "che vengano inizializzati automaticamente a zero"
Ah, automatic; parlo di array in funzione, quindi in stack (non array in global).
Quindi se non lo inizializzo per nulla, avrei valori sporchi ma se inizializzo anche solo un elemento e gli altri non li indico allora B&K dice devono essere posti a zero dal compilatore. Ho capito bene ?
Siccome non ho mai visto char array[10]='c'; ho provato su ideone, dice inizializzazione non valida! Adesso non so se tutti i compilatori si comportino cosi ma su alcuni non è accettato
nid69ita Se inizializzi parzialmente un array i restanti elementi vengono inizializzati automaticamente a zero
Avrai visto sicuramente questa sintassi int array[10]={0}; primo a zero gli atri automaticamente a zero
torn24: nid69ita Se inizializzi parzialmente un array i restanti elementi vengono inizializzati automaticamente a zero
Avrai visto sicuramente questa sintassi int array[10]={0}; primo a zero gli atri automaticamente a zero
Si, avevo visto. Non davo per scontato che gli altri poi fossero a zero. ^-^
torn24:
Siccome non ho mai visto char array[10]='c'; ho provato su ideone, dice inizializzazione non valida!
Ovvio che NON è valida, è un bell'errore di sintassi cercare di assegnare un char ad un array di char (... l'array, di perse, è un puntatore ad una serie continua di bytes) !!!
La giusta sintassi è assegnare un array di char ... con un solo elemento
char array[10]={'c'};
Con questo dovrebbe essere ovvio che invece è corretto scrivere ...
char array[10]="c";
dato che "c" è esattamente un array di char con due elementi, il primo che vale 0x63 ed il secondo che vale 0x00
gpb01:
La giusta sintassi è assegnare un array di char ... con un solo elemento
char array[10]={'c'};
Si ma in questo caso non è detto che array[1] sia \0, se deve essere trattato come una stringa e non semplice array di singoli char, sarebbe più corretto inizializzarla come:
char array[10]={'c', 0};
Ma ovviamente non ha alcun senso fare questo ossia inizializzare una stringa con un solo carattere trattandola come array di char, si deve fare semplicemente quello che ha scritto Guglielmo:
char array[10]="c";
dato che "c" è esattamente un array di char con due elementi, il primo che vale 0x63 ed il secondo che vale 0x00
[/quote]
docdoc:
Si ma in questo caso non è detto che array[1] sia \0 ....
... Veramente è già stato appurato che ...
Standardoil:
Secondo il K&R quando inizializzando un array vengono definiti meno elementi della sua dimensione è prescritto che gli elementi restanti siano a zero ...
Si, ma una cosa è il K&R, una cosa può essere una implementazione di un compilatore in base alla piattaforma, ed io che sono malfidato di natura, preferisco fare le cose per me più "sicure", soprattutto se mi costano poco.