2011-09-28 19 views

Respuesta

22

La notación de barra diagonal inversa en un literal de caracteres le permite especificar el valor numérico de un carácter en lugar de usar el carácter en sí. Entonces '\1' [*] significa "el personaje cuyo valor numérico es 1", '\2' significa "el personaje cuyo valor numérico es 2", etc. Casi. Debido a una peculiaridad de C, los literales de caracteres en realidad tienen el tipo int, y de hecho int se usa para manejar caracteres en otros contextos también, como el valor de retorno de fgetc. Por lo tanto, '\1' significa "el valor numérico como int, del carácter cuyo valor numérico es 1", y así sucesivamente.

Desde caracteres son valores numéricos en C "el personaje cuyo valor numérico es 1" en realidad es(char)1, y la decoración adicional en '\1' tiene ningún efecto sobre el compilador - '\1' tiene el mismo tipo y valor como 1 en C. Así la notación de barra invertida es más necesaria en los literales de cadena que en caracteres literales, para la introducción de caracteres no imprimibles que no tienen su propio código de escape.

Personalmente, yo prefiero escribir 0 cuando me refiero a 0, y dejar que las conversiones implícitas hagan lo suyo. Algunas personas lo encuentran muy difícil de entender. Cuando trabaje con esas personas, es útil escribir '\0' cuando se refiera a un carácter con valor 0, es decir, en los casos en los que espera que su 0 pronto se convierta implícitamente en tipo char. Del mismo modo, puede ayudar escribir NULL cuando se refiere a una constante de puntero nulo, 0.0 cuando se refiere a un doble con valor 0, y así sucesivamente.

si tiene alguna diferencia para el compilador, y si se necesita un yeso, depende del contexto. Desde '\0' tiene exactamente el mismo tipo y valor como 0, tiene que ser echado a char exactamente en las mismas circunstancias.Por lo tanto, '\0' y (char)0 difieren en el tipo, para expresiones exactamente equivalentes puede considerar (char)'\0' contra (char)0, o '\0' contra . NULL tiene un tipo definido por la implementación; a veces debe convertirse en un tipo de puntero, ya que puede tener un tipo de entero. 0.0 tiene tipo double, por lo que es ciertamente diferente de 0. Aún así, float f = 1.0; es idéntico a float f = 1; y float f = 1.0f, mientras que 1.0/i, donde i es un int, generalmente tiene un valor diferente de 1/i.

Por lo tanto, cualquier regla general sobre si usar '\0' o 0 es puramente para la comodidad de los lectores de su código, es lo mismo para el compilador. Escoja lo que usted (y sus colegas) prefiera el aspecto de, o quizás defina una macro ASCII_NUL.

[*] o '\01' - desde la barra invertida introduce un número octal, no decimal, a veces es conveniente hacer esto un poco más claro al asegurar que comienza con un 0., es indiferente para 0, 1, 2 por supuesto. Digo "a veces", porque la barra diagonal inversa solo puede seguir con 3 dígitos octales, por lo que no puede escribir \0101 en lugar de \101, para recordarle al lector que es un valor octal. Todo es bastante incómodo y lleva a una decoración aún mayor: \x41 para una A mayúscula, y por lo tanto podría escribir '\x0' para 0 si lo desea.

25

Ambos son un 0, pero (char) 0 es un char, mientras que '\0' es (intuitivamente) un int. Por lo general, esta diferencia de tipo no debería afectar su programa si el valor es 0.

Prefiero '\0', ya que esa es la constante prevista para eso.

+0

I agreen: cuando recurres al casting, creo que deberías tener al menos otra opinión sobre el problema. ¿Por qué comparar una manzana con una naranja? –

+7

No debería tener que lanzar. Creo que 'char c = 0;' es legal, y se compila en gcc con '-Wextra -pedantic'. Solo creo que '' \ 0'' expresa mejor la intención. –

+0

He truncado una cadena como parte de mi código. Entonces, al agregar un carácter nulo en la parte donde tengo que terminarlo, me confundí en cuanto a cuál representación es mejor. – Sathya

2

Cero puede significar muchas cosas diferentes en C. Debe usar el carácter nulo '\ 0', porque entonces no puede haber confusión sobre que su intención es la terminación de cadena.

Si configura un carácter char en 0, eso puede significar la terminación nula, pero también puede significar que solo está utilizando el carácter char como un entero de 8 bits para cálculos, en lugar de hacerlo como parte de una cadena. Esto se puede confundir aún más si también está usando punteros en el mismo código y compararlos contra cero, que es entonces un puntero nulo.

+0

Ok gracias! usaré '\ 0' ¡entonces! – Sathya

+0

Vaya, he votado negativamente por accidente (fumble de dedos). Demasiado tarde para arreglarlo, pero si haces una edición, podría eliminar el voto a favor. –

+0

Umm ok ... edición aleatoria hecha. – Lundin

-1

matriz de caracteres significa que usted está tomando cadena así que le aconsejo que use '\0' al final del array de caracteres después de leer todos los caracteres del usuario, ya que a partir 0 es simple carácter, pero es '\0'NULL el que indica el final de la cadena.

+0

'(char) 0' y' '\ 0'' tiene el mismo valor, pero '' \ 0'' es el más utilizado, porque este es el' char' destinado al carácter nulo. – chema989

Cuestiones relacionadas