Me gustaría saber si hay una diferencia entre:¿Cuál es la diferencia entre {0} y ""?
char s[32] = "";
y:
char s[32] = {0};
Gracias.
Me gustaría saber si hay una diferencia entre:¿Cuál es la diferencia entre {0} y ""?
char s[32] = "";
y:
char s[32] = {0};
Gracias.
No hay ninguna diferencia entre las dos declaraciones:
char bla[32] = {0};
and
char bla[32] = "";
Ver el apartado correspondiente de la Norma C (el énfasis es mío):
(C99, 6.7.8p21) "Si hay menos inicializadores en una lista incluida en paréntesis que elementos o miembros de un agregado, o menos caracteres en una cadena literal utilizada para inicializar una matriz de tamaño conocido que no hay elementos en la matriz, el resto del agregado debe ser inicializado implícitamente el s ame como objetos que tienen una duración de almacenamiento estática ".
Ok, muchas gracias! – md5
Eso es, siempre que ''\ 0' == 0'. – Philip
@Philip No tengo una cita del estándar, pero esto es lo que dice K & R 2nd * "La constante de caracteres '\ 0' representa el carácter con valor cero, el carácter nulo. '\ 0' a menudo se escribe en lugar de 0 para enfatizar la naturaleza del carácter de alguna expresión, pero el valor numérico es solo 0. "* – ouah
En ese caso, no hay diferencia, tanto inicializar todas las ranuras de la matriz a 0. En general, ""
sólo funciona para char
arrays (con o sin modificaciones como const
o unsigned
), pero {0}
obras para arrays de todos numérico tipos.
En la sección 6.7.9 de la norma (n1570), punto 21 lee
Si hay menos inicializadores en una lista abrazadera-cerrado que elementos o miembros de un agregado, o menos caracteres en un literal de cadena usado para inicializar una matriz de tamaño conocido que hay elementos en la matriz, el resto del agregado debe ser inicializado implícitamente lo mismo que los objetos que tienen una duración de almacenamiento estática.
por lo que incluso ""
inicializa la matriz completa.
+1 '{0}' funciona para cualquier tipo de datos que pueda tener un inicializador. Por otro lado * no está * permitido para todas las matrices, es decir, no para VLA, ya que estas no deben tener inicializadores. –
El resultado de ambas expresiones es el mismo: una cadena vacía. Sin embargo, el primero es más explícito, por lo tanto más legible.
No hay diferencia. ¡También puedes verlo por ti mismo! Esa es la respuesta más confiable que puedes obtener. Solo usa un depurador. Ejecute las dos líneas y compare el resultado. Pero debería cambiar el nombre de las matrices. Yo uso gcc/gdb y compilar el código
int main(int argc, char* argv[])
{
char s[5] = {0};
char t[5] = "";
return 0;
}
siguiente a través de test.c gcc -g y luego invoque a.out BGF. En GDB entro
break 5
run
print s
la última declaración es contestada por el BGF con el siguiente resultado:
$1 = "\000\000\000\000"
i continúe y anote "camiseta de la impresión" y obtener en consecuencia
$2 = "\000\000\000\000"
que cuenta que con mi compilador de elección ambas declaraciones dan como resultado el mismo resultado.
Matthias: ese no es el método más confiable, ya que cualquier comportamiento indefinido puede variar entre las implementaciones del compilador o debido a diferencias en el contenido de la memoria no inicializada ... –
@ tony-delroy lo aclaré y espero haber aclarado mi punto (no lo hice en realidad, es tuyo ...) – Matthias
mi punto es que saber qué hace tu programa en una ejecución en particular no prueba lo que el estándar de C++ requiere que ejecute cualquier ejecutable generado a partir de ese código fuente por cualquier compilador de C++. Si desea un código confiable, cumpla con lo que garantiza el estándar, ya que el comportamiento del programa observable puede variar. Por ejemplo, si lee de una variable no inicializada - 'int x; std :: cout << x << '\ n'; '- puede ver el número que está esperando por casualidad (especialmente si espera un 0), pero vuelva a ejecutar el programa, o recompilelo, y puede obtener resultados diferentes ... –
Además de lo que ya se ha dicho:
char s[32] = "";
=
char s[32] = {'\0'};
=
char s[32] = {0};
=
char s[32] = {0, 0, 0, /* ...32 zeroes here*/ ,0 };
Todos estos darán como resultado exactamente el mismo código de máquina: una matriz de 32 bytes llena con todos los ceros.
La respuesta ha sido dada. Pero en caso de que piense que ahora no hay diferencia entre '{0}' y '" "', intente esto con otros tipos, por ejemplo, arreglos 'int' en lugar de arreglos' char'. Entonces verás la diferencia. –