Qual è la differenza tra l'utilizzo di (char)0
e '\0'
per indicare il carattere null terminante in un array di caratteri?Qual è la differenza tra (char) 0 e ' 0'? in C
risposta
La notazione backslash in un carattere letterale consente di specificare il valore numerico di un carattere anziché utilizzare il carattere stesso. Quindi '\1'
[*] significa "il cui valore numerico è 1", '\2'
significa "il cui valore numerico è 2", ecc. Quasi. A causa di una stranezza di C, i caratteri letterali in realtà hanno il tipo int
, e infatti lo int
viene utilizzato anche per gestire i caratteri in altri contesti, come il valore di ritorno di fgetc
. Quindi '\1'
significa "il valore numerico come int, del carattere il cui valore numerico è 1" e così via.
Poiché caratteri sono valori numerici in C, "il carattere il cui valore numerico è 1" realtà è(char)1
, e la decorazione extra '\1'
ha alcun effetto sul compilatore - '\1'
ha lo stesso tipo e valore 1
in C. Quindi la notazione backslash è più necessaria in stringhe letterali che in caratteri letterali, per l'inserimento di caratteri non stampabili che non hanno il proprio codice di escape.
Personalmente, preferisco scrivere 0
quando intendo 0, e lasciare che le conversioni implicite facciano le loro cose. Alcune persone lo trovano molto difficile da capire. Quando si lavora con queste persone, è utile scrivere '\0'
quando si intende un carattere con valore 0, vale a dire nei casi in cui si prevede che il proprio 0
si converta presto in tipo char
. Allo stesso modo, può aiutare a scrivere NULL
quando si intende una costante di puntatore nullo, 0.0
quando si intende un doppio con valore 0 e così via.
Se fa differenza per il compilatore e se ha bisogno di un cast, dipende dal contesto. Poiché '\0'
ha esattamente lo stesso tipo e valore di 0
, è necessario eseguire il cast allo char
esattamente nelle stesse circostanze.Quindi '\0'
e (char)0
differiscono nel tipo, per espressioni esattamente equivalenti è possibile considerare (char)'\0'
rispetto a (char)0
o '\0'
rispetto a 0
. NULL
ha un tipo definito dall'implementazione - a volte è necessario eseguire il cast su un tipo di puntatore, poiché potrebbe avere un tipo intero. 0.0
ha il tipo double
, quindi è sicuramente diverso da 0
. Tuttavia, float f = 1.0;
è identico a float f = 1;
e float f = 1.0f
, mentre 1.0/i
, dove i
è un numero intero, di solito ha un valore diverso da 1/i
.
Quindi, qualsiasi regola generale se utilizzare '\0'
o 0
è puramente per la comodità dei lettori del codice - è lo stesso per il compilatore. Scegli quale (e i tuoi colleghi) preferiscono l'aspetto o forse definisci una macro ASCII_NUL
.
[*] o '\01'
- dal momento che il backslash introduce un numero ottale, non decimale, a volte è saggio fare questo un po 'più evidente, assicurando si inizia con uno 0. fa alcuna differenza per 0, 1, 2 ovviamente. Dico "a volte", perché il backslash può essere seguito solo da 3 cifre ottali, quindi non è possibile scrivere \0101
invece di \101
, per ricordare al lettore che si tratta di un valore ottale. È tutto abbastanza imbarazzante, e porta a un numero ancora maggiore di decorazioni: \x41
per la A maiuscola, e potresti quindi scrivere '\x0'
per 0 se lo desideri.
Sono entrambi uno 0, ma (char) 0
è un carattere, mentre '\0'
è (unintuitivamente) uno int
. Questa differenza di tipo non dovrebbe in genere influire sul programma se il valore è 0.
Preferisco '\0'
, poiché è la costante prevista per quello.
Zero può significare un sacco di cose diverse in C. È necessario utilizzare il carattere null '\ 0', perché quindi non può esserci confusione sul fatto che l'intenzione è la terminazione della stringa.
Se si imposta un char su 0, ciò può significare terminazione nulla, ma può anche significare che si sta solo utilizzando il char come un numero intero a 8 bit per i calcoli, anziché come parte di una stringa. Questo può essere ulteriormente confuso se si utilizzano anche puntatori nello stesso codice e li si confronta con lo zero, che è quindi un puntatore nullo.
array di caratteri significa che si sta assumendo String quindi vi consiglio di utilizzare '\0'
alla fine del carattere Array dopo aver letto tutti i personaggi di da utente a causa 0
è semplice carattere ma '\0'
è NULL
che indica la fine della stringa.
'(char) 0' e' '\ 0'' è lo stesso valore, ma '' \ 0'' è il più usato, perché questo è il' char' destinato al carattere null. – chema989
I agreen: quando ricorri al casting penso che dovresti avere almeno un altro pensiero sul problema. Perché confrontare una mela con un'arancia? –
Non dovrebbe essere obbligato a trasmettere. Credo che 'char c = 0;' sia legale, e si compila su gcc con '-Wextra -pedantic'. Penso solo che '' \ 0 '' esprime meglio l'intenzione. –
Ho troncato una stringa come parte del mio codice. Quindi, mentre aggiungo il carattere null alla parte in cui devo terminarlo, ho una confusione su quale sia la rappresentazione migliore. – Sathya