2011-09-28 11 views

risposta

22

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.

25

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.

+0

I agreen: quando ricorri al casting penso che dovresti avere almeno un altro pensiero sul problema. Perché confrontare una mela con un'arancia? –

+7

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. –

+0

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

2

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.

+0

Ok grazie !! userò '\ 0' allora! – Sathya

+0

Oops, l'ho downvoted per sbaglio (dito fumble). Troppo tardi per risolverlo, ma se fai una modifica potrei rimuovere il downvote. –

+0

Umm ok ... modifica casuale fatta. – Lundin

-1

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.

+0

'(char) 0' e' '\ 0'' è lo stesso valore, ma '' \ 0'' è il più usato, perché questo è il' char' destinato al carattere null. – chema989