Acabo de tener el compilador C/C++ de Apple inicializar un flotador a un valor distinto de cero (aproximadamente "-0.1").¿A qué se inicializan por defecto los tipos primitivos en C?
Eso fue una gran sorpresa, y solo sucedió de vez en cuando (pero 100% repetible, si ejecutó previamente la misma función llamadas/argumentos de antemano). Tomó mucho tiempo rastrear (usando aserciones).
Pensé que las carrozas no se inicializaron. Google sugiere que estaba pensando en C++ (que, por supuesto, es mucho más preciso sobre este tema - c.f. SO: What are primitive types default-initialized to in C++?).
Pero tal vez la excusa de Apple aquí es que su compilador se estaba ejecutando en modo C ... entonces: ¿qué pasa con C? ¿Qué debería pasar y (más importante) qué es típico?
(por supuesto yo, hubiera inicializado manualmente - Yo normalmente - pero en éste caso no he logrado yo no esperaba que hiciera saltar, sin embargo.!)
(Google está resultando peor que inútil para cualquier discusión de este -. su búsqueda actual se niega a mostrar "C" sin "C++" Keeps decidir que soy demasiado estúpida, e ignorando incluso mi entrada, incluso cuando se ejecuta en modo avanzado)
Aquí está el real ejemplo de fuente donde sucedió. Al principio pensé que podría haber un problema con las definiciones de MAX y ABS (¿tal vez MAX (ABS, ABS) no siempre hace lo que cabría esperar?) ... pero cavando con aserciones y depuraciones, finalmente encontré que faltaba inicialización - flotador que se iba a init'd valor distinto de cero muy ocasionalmente):
float crossedVectorX = ... // generates a float
float crossedVectorY = ... // generates a float
float infitesimal; // no manual init
float smallPositiveFloat = 2.0/MAX(ABS(crossedVectorX), ABS(crossedVectorY));
// NB: confirmed with debugger + assertions that smallPositiveFloat was always positive
infitesimal += smallPositiveFloat;
NSAssert(infitesimal >= 0.0, @"This is sometimes NOT TRUE");
Depende de dónde se produzca esa "inicialización", es posible que no se inicialice en absoluto. – Mat
Agregué copiar/pegar de la fuente donde vi el problema. Me pareció que debería haber sido iniciado? – Adam
+1 por hacer una pregunta que a todos les conviene saber la respuesta. – borrrden