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?
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 dei
en la expresióna[++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 quea[2]
recibe el valor dei
, que es2
. Sin embargo, los valores ena[0]
,a[1]
,a[3]
ya[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 a0
utilizando el constructor por defecto denode
en la líneastruct 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++.