es esta forma de inicializar una matriz a todos los 0
char myarray[ARRAY_SIZE] = {0}
soportado por todos los compiladores? ,
si es así, ¿hay una sintaxis similar a otros tipos? por ejemplo
bool myBoolArray[ARRAY_SIZE] = {false}
eli
es esta forma de inicializar una matriz a todos los 0
char myarray[ARRAY_SIZE] = {0}
soportado por todos los compiladores? ,
si es así, ¿hay una sintaxis similar a otros tipos? por ejemplo
bool myBoolArray[ARRAY_SIZE] = {false}
Hormiga
Sí, todos los compiladores de C++ admiten esta forma de inicialización. Es una parte del lenguaje C++. De hecho, es un modismo que llegó a C++ desde el lenguaje C. en lenguaje C = { 0 }
es un idiomático inicializador de cero universal. Esto es también casi el caso en C++.
Como este inicializador es universal, por bool
array realmente no necesita una “sintaxis” diferente. 0
funciona como un inicializador para bool
escriba también, así que
bool myBoolArray[ARRAY_SIZE] = { 0 };
está garantizado para inicializar toda la matriz con false
. Así como también
char* myPtrArray[ARRAY_SIZE] = { 0 };
garantizado para inicializar toda la matriz con punteros nulos de tipo char *
.
Si cree que mejora la legibilidad, ciertamente puede usar
bool myBoolArray[ARRAY_SIZE] = { false };
char* myPtrArray[ARRAY_SIZE] = { nullptr };
pero el punto es que = { 0 }
variante te da exactamente el mismo resultado
Sin embargo, en C++ = { 0 }
podría no funcionar para todos los tipos, como los tipos de enumeración, por ejemplo, que no se pueden inicializar con integral 0
. Pero C++ admite la forma más corta
T myArray[ARRAY_SIZE] = {};
es decir, sólo un par vacío de {}
. Esto inicializará por defecto una matriz de cualquier tipo (suponiendo que los elementos permitan la inicialización predeterminada), lo que significa que para los tipos básicos (escalares) toda la matriz se inicializará correctamente en cero.
y en c++ 0x podrás inicializar algo como esto
– jk.
17 dic. 09 a las 09:37
En mi compilador (qt Creator 2.4.1 – qt versión 4.8.0) si escribo bool myBoolArray[ARRAY_SIZE] = { false };
la matriz se inicializa en falso, pero si escribo bool myBoolArray[ARRAY_SIZE] = { true };
solo el primer elemento se establece en verdadero, mientras que todo lo demás es falso. ¿Alguna explicación?
– codificador novato
30 jun.
codificador @rookie: ¿Explicación de qué exactamente? ¿Qué esperas que suceda? En C++, si parcialmente inicializar un bool
matriz, el resto se inicializa en cero para usted. Esa es la forma como es.
– Ant
30 jun.
@AndreyT Bien, pero encuentro este comportamiento al menos contrario a la intuición. Si no inicializo, como bool myBoolArray[ARRAY_SIZE];
, la matriz contiene legítimamente valores aleatorios, por lo tanto, no habría esperado que una inicialización pudiera devolver una matriz con diferentes valores. Eso es todo.
– codificador novato
01 jul.
@AndreyT: claro, pero nunca hubiera pensado que la avalancha hubiera sido diferente del primer elemento 😉 De todos modos, ¡gracias por la información!
– codificador novato
02 jul.
Tenga en cuenta que ‘=’ es opcional en la sintaxis de inicialización universal de C++ 11, y generalmente se considera un mejor estilo para escribir:
char myarray[ARRAY_SIZE] {0}
Como entender char myarray[ARRAY_SIZE] {0}
? Inicie cada elemento de myarray
por ARRAY_SIZE
¿veces?
– John
09 oct.
jasonline
Sí, creo que debería funcionar y también se puede aplicar a otros tipos de datos.
Sin embargo, para las matrices de clase, si hay menos elementos en la lista de inicializadores que elementos en la matriz, se usa el constructor predeterminado para los elementos restantes. Si no se define un constructor predeterminado para la clase, la lista de inicializadores debe estar completa, es decir, debe haber un inicializador para cada elemento de la matriz.
Puede declarar la matriz en C++ de este tipo de formas. Si conoce el tamaño de la matriz, debe declarar la matriz para: entero: int myArray[array_size];
Doble: double myArray[array_size];
Char y cadena: char myStringArray[array_size];
La diferencia entre char y string es la siguiente
char myCharArray[6]={'a','b','c','d','e','f'};
char myStringArray[6]="abcdef";
Si no conoce el tamaño de la matriz, debe dejar la matriz en blanco como se muestra a continuación.
entero: int myArray[array_size];
Doble: double myArray[array_size];
.
apuesto buen dinero
false
es lo mismo que0
(de lo contrarioif(false)
no se evaluaría como falso), por lo que lo que tiene probablemente funcionará en el 99% de los compiladores. No puedo estar seguro sobre el otro 1% hasta que citemos el estándar.– Chris Lutz
17 dic. 2009 a las 09:24
Sé que en C,
int a[10] = { 1, 2, 3 };
estableceráa[3]..a[9]
a0
, (“se inicializa implícitamente igual que los objetos que tienen una duración de almacenamiento estática”). ¿Es esto cierto para C++?– Alok Singhal
17 dic. 09 a las 09:36
Sí, lo hace. Si no fuera cierto para C++, entonces C++ no sería ni remotamente compatible con versiones anteriores de C.
– Chris Lutz
17 dic. 09 a las 09:46
false
no es lo mismo que0
pero en{0}
el 0 se convierte enfalse
y en (para C++){}
ni siquiera tiene que preocuparse por las conversiones: se inicializa parafalse
o0
o puntero nulo o cualquier otro valor predeterminado sensible al tipo.– Johannes Schaub – litb
17 dic. 09 a las 13:04