Es bien sabido que la falta de inicializadores para un conjunto de escalares son de pago a cero.

int A[5]; //Entries remain uninitialized
int B[5]= { 0 }; //All entries set to zero

Pero es este (abajo) garantizado ?

int C[5]= { }; //All entries set to zero
  • Leer acerca de agregado de inicialización.
  • Ya he leído acerca de los inicializadores de matriz. Esta en particular la explicación es más oscura que cualquier otra cosa.
  • etiqueta de como duplicar, entonces.
  • así, de forma similar, stackoverflow.com/questions/38840514
  • mh, mi pregunta es específicamente acerca de vacío llaves, que parece que nunca aparecen en los ejemplos. Uno (me) puede estar tentado a creer que no soportes en todos. Eso es lo que yo necesitaba para comprobar.
  • OK. El B y C en su pregunta en realidad son cubiertos por la misma regla , las entradas no se da inicializadores son inicializados a cero
  • Esta es la razón por la {0} es confusa o engañosa.

InformationsquelleAutor Yves Daoust | 2016-08-11

3 Comentarios

  1. 66

    El vacío armado de inicialización que se realiza la agregación de inicialización de la matriz: esto conduce a cero-inicialización de la int elementos.

    Sí, esto está garantizado.

    • int C[5] no es un tipo de clase, por lo que el valor de inicialización no se realiza, el agregado de que la inicialización se realiza.
    • y ? ¿Este cambio de la conclusión ?
    • si se trata de un tipo de clase o no no influye en que el agregado de que la inicialización se realiza. Todos inicialización de matrices es el agregado de inicialización. Además, el agregado de inicialización está definido de tal forma que los miembros sin inicializador son de valor inicializado (que es equivalente a la inicialización de cero, para int)
    • Así, la norma dice que «[…] y T es un tipo de clase con un constructor predeterminado […] de lo Contrario, si T es un tipo agregado […]», de manera que si se trata de un tipo de clase o no importa (no estoy hablando de int aquí, yo estoy hablando de int[5]). Desde aquí T es int[5], T es un tipo de matriz, no de un tipo de clase, por lo que el agregado de que la inicialización se realiza, no en el valor de inicialización. Los elementos de C será entonces el valor inicializado, pero la primera cosa que «hacer» es agregado de inicialización. Yo no estaba señalando la conclusión de que, simplemente, la redacción de la respuesta.
    • descifrar el estándar de C++ es un juego sin fin.
    • si T es un tipo de matriz, que no es una clase de tipo
    • Sí, eso es exactamente lo que he dicho en mi comentario.
    • esta pregunta es sólo acerca de la inicialización de matrices así que no estoy seguro de dónde vienes
    • C[5] = {} es lista de inicialización con T = int[5], por la norma de esta se realiza el agregado de inicialización, pero el respuesta inicial fue mencionar el valor de inicialización, que sería el caso si T era un tipo de clase con un constructor predeterminado. Me acaba de señalar que lo que estaba sucediendo aquí fue agregado de inicialización, no en el valor de inicialización.
    • Usted y yo estamos diciendo lo mismo desde el primer comentario, que probablemente no vea la respuesta original que es la razón por la que confunden el sentido de mi comentario (solo vistazo a la edición de la revisión).
    • De hecho, me hizo modificar para mejor uso de la terminología, siguiendo los útiles comentarios de @Holt.
    • Siempre me pregunto cómo la gente sabe que tipo de cosas. Quiero decir, ¿cómo saber que esta «agregación de inicialización»? ¿Cuáles son tus fuentes, si se me permite preguntar?
    • Stroustrup es bastante completa, y respondiendo a las preguntas en este sitio ayuda a mantener y perfeccionar conocimientos.

  2. 35

    Sí, de acuerdo a la regla de agregado de inicialización, es garantizado que todos los elementos de la matriz de C será valor inicializado, es decir, inicializados a cero a 0 en este caso).

    (el énfasis es mío)

    Si el número de inicializador de cláusulas es menor que el número de miembros de la and bases (since C++17) o lista de inicializador está completamente vacío, el resto de los miembros de la and bases (since C++17) se inicializan by their default initializers, if provided in the class definition, and otherwise (since C++14) por el vacío de las listas, de conformidad con la habitual lista de inicialización de reglas (la que se realiza el valor de inicialización para los no-tipos de clase y no agregada clases con los constructores predeterminados, y el agregado de inicialización para los agregados).


    PS:

    int A[5]; //Entries remain uninitialized

    «siguen sin inicializar» podría no ser exacta. Para int A[5];, todos los elementos de A será defecto-inicializado. Si A es estática o local de subprocesos objeto, los elementos serán inicializados a cero a 0, de lo contrario no se hace nada, que van a ser indeterminado valores.

    • Gracias por el PS.
    • Puesto que usted está citando algunos especificación formal (usted debe decir que uno, en realidad), A[5], correctamente, es default-inicializa.
    • Seguro, traté de hacer las específicas.
  3. 2

    De hecho, cuando usted diceint A[5] = { 0 };
    usted está diciendo: Inicializar el primer elemento a cero. Todas las demás posiciones se inicializan a cero, porque de la suma de inizialization.

    Esta línea es el verdadero responsable de tener su matriz completa de ceros: int A[5] = { };

    Es por eso que si usted utiliza int A[5] = { 1 };, sólo tendrá la primera posición inizialized a 1.

    • Pero, OP preguntando acerca de vacío lista de inicializador.
    • ya respondidas por otros usuarios. Haciendo sólo el punto más claro
    • Esta debe ser la respuesta correcta, como las matrices tienen un comportamiento diferente para el inicializador de las listas.
    • buen punto! Desde int B[5]= { 0 }; no tiene sentido.

Dejar respuesta

Please enter your comment!
Please enter your name here