¿Cuál es la diferencia entre usar (char)0
y '\0'
para denotar el carácter nulo de terminación en una matriz de caracteres?¿Cuál es la diferencia entre (char) 0 y ' 0'? en C
Respuesta
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.
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.
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.
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.
'(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
- 1. ¿Cuál es la diferencia entre {0} y ""?
- 2. ¿Cuál es la diferencia entre -0 y 0?
- 3. ¿Cuál es la diferencia entre [0-9] + y [0-9] ++?
- 4. diferencia entre (* ++ argv) [0] y mientras (c = * ++ argv [0])
- 5. Diferencia entre array.GetLength (0) y array.GetUpperBound (0)
- 6. C++ diferencia entre 0 y 0.0
- 7. ¿Cuál es la diferencia entre sys.exit (0) y os._exit (0)
- 8. Diferencia entre $ a = 0 y $ a = '0' en PHP
- 9. ¿Hay alguna diferencia entre i == 0 y 0 == i?
- 10. Diferencia entre list.First(), list.ElementAt (0) y list [0]?
- 11. Diferencia entre char * y char [] en C
- 12. Diferencia entre Array.length = 0 y Array = []?
- 13. ¿Cuál es el significado de char cero (0) en Java?
- 14. Diferencia entre __file__ y sys.argv [0]
- 15. diferencia CSS entre 0 y 0em
- 16. Diferencia entre byte y char en C
- 17. ¿Qué es '\ 0' en C++?
- 18. ¿Cuál es la diferencia entre href = "", href = "#" y href = "javascript: void (0)"?
- 19. ¿Cuál es la diferencia entre list [-1:] [0] y list [len (list) -1]?
- 20. Diferencia entre char y char [1]
- 21. cuál es la diferencia de setVisibility (View.INVISIBLE); setVisibility (0);
- 22. Diferencia entre virtual void funcFoo() const = 0 y virtual void funcFoo() = 0;
- 23. 0 + 0 + 0 ... + 0! = 0
- 24. Cuál es la diferencia entre el nuevo char [10] y el nuevo char (10)
- 25. php 5 strpos() ¿diferencia entre devolver 0 y falsa?
- 26. ¿Hay una diferencia entre BigDecimal ("0") y BigDecimal.ZERO?
- 27. ¿Qué es decltype (0 + 0)?
- 28. ¿Qué es! 0 en C?
- 29. Diferencia entre los tipos de cadena y char [] en C++
- 30. Es menos cero (-0) equivalente a cero (0) en C#
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? –
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. –
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