En C, ¿tiene sentido inicializar una variable a su propio valor? Si es así, ¿para qué?Inicializar una variable en su propio valor indefinido
Déjenme elaborar. En las fuentes de Git, hay algunos ejemplos de inicialización de una variable a su propio valor indefinido, como se ve en transport.c o wt-status.c. Eliminé las asignaciones de esas declaraciones y realicé pruebas. Al no ver regresiones, pensé que esas asignaciones eran redundantes.
Por otro lado, hice algunas pruebas simples con GCC 4.6 y Clang 2.9.
#include <stdio.h>
int main() {
printf("print to increase probability of registers being non-zero\n");
int status = status;
return printf("%i\n", status);
}
Compilar con -Wall -std=c99
y varios niveles -O
imprime ninguna advertencia y muestra que status == 0
. Clang con un nivel de optimización distinto de cero imprime algunos valores de basura. Me hace inferir que los resultados de tales expresiones no están definidos.
Me imagino que dicha asignación puede suprimir una advertencia de variable no inicializada, pero no es el caso de los ejemplos tomados de Git. Eliminar asignaciones no introduce ninguna advertencia.
¿Son estas asignaciones un comportamiento indefinido? Si no, ¿para qué los usas?
He sugerido el cambio en la lista de correo de Git. Here's what I've learned.
Tal vez los ejemplos en git no supriman una advertencia de variable no inicializada para * su * sistema, pero en sistemas que otros desarrolladores utilizan regularmente. Con GCC, las advertencias de variables no inicializadas se ven afectadas por indicadores de optimización, y Clang produce un conjunto de advertencias bastante diferente, aunque es un "reemplazo directo" para GCC. –
Inicializaría tales variables a 0 (o -1) en lugar de descartar la inicialización por completo. Alguien agregó el código para un propósito; Puedo respetar el propósito aunque encuentre extraño el mecanismo. –
@JonathanLeffler, no solo es extraño, en plataformas con representaciones de trampa esto produce un comportamiento indefinido. –