es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Un fenómeno extraño para inicializar una estructura con las Literales Compuestas de GNU C++ (¿quizás UB?)

#include <cstdio> // GCC C++17

struct node{int x;}a[5];
signed main()
{
    int i=1;
    a[++i]=(node){i};
    for(int i=0;i<5;++i)printf("%d ",a[i].x);
}

Desde C++17, a[++i]=i no es un comportamiento indefinido (UB).

De acuerdo con las reglas de Secuencia-antes,

a[++i]=i es equivalente a a[i+1]=i, i+=1 (en C++17).

Pero, ¿por qué el código anterior imprime 0 0 2 0 0 en lugar de 0 0 1 0 0?

Cuando lo intento:

#include <cstdio> // GCC C++17

struct node{int x;node(){x=0;}node(int x){x=x;}}a[5];
signed main()
{
    int i=1;
    a[++i]=node(i);
    for(int i=0;i<5;++i)printf("%d ",a[i].x);
}

No hay este problema, imprime 0 0 1 0 0.

He leído la documentación de GNU pero no puedo encontrar información válida.

¿Entonces qué está pasando?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema en el primer fragmento de código se debe a que el objeto a[++i] no está inicializado cuando se le asigna el valor de i en la expresión a[++i]=(node){i};. Esto conduce a un comportamiento indefinido, según el estándar de C++.

    El valor de i se incrementa antes de la asignación, por lo que a[2] recibe el valor de i, que es 2. Sin embargo, los valores en a[0], a[1], a[3] y a[4] no están inicializados, por lo que pueden contener cualquier valor arbitrario.

    En el segundo fragmento de código, los objetos en el arreglo a se inicializan a 0 utilizando el constructor por defecto de node en la línea struct node{int x;node(){x=0;}node(int _x){x=_x;}}a[5];. Por lo tanto, no hay un comportamiento indefinido y la salida es la esperada.

    Es importante siempre inicializar variables y objetos para evitar comportamientos indefinidos en C++.

Comments are closed.