He declarado una variable booleana bool abc;
en una clase y pensé que sería falsa por defecto. Una condición if en mi programa if (abc)
resultó ser verdadera, entonces saqué el valor de abc y vi que contenía el valor 55. ¿Es esto normal? ¿Siempre tenemos que asignar 'bool abc = false' para estar seguros de que es falso?Las variables booleanas no siempre son falsas por defecto?
Respuesta
Sí, siempre debe inicializar sus variables. Hasta que aprenda íntimamente los tiempos en que es y no es necesario hacerlo explícitamente, debe hacerlo todo el tiempo, pase lo que pase. Y para entonces ... bueno ... ¿por qué dejar un buen hábito?
para inicializar un bool false es suficiente para defecto construirlo:
struct X
{
bool b;
X() : b() {}
};
Me gusta agregar el booleano explícito literal falso (para mí eso lo hace más legible (aunque técnicamente no es diferente del tuyo)). –
Hablando de primitiva (bool, char, wchar_t, short, int, long, float incorporado en los tipos de datos, dobles , long double), de acuerdo con el estándar C++, , solo las variables globales obtienen un valor predeterminado de cero si no se inicializan explícitamente.
Para variables locales no es necesario que el compilador limpie el contenido de la memoria a la que están asignados. Una variable local, si no se inicializa explícitamente, contendrá un valor arbitrario.
Técnicamente son variables de 'duración de almacenamiento estático' las variables globales son un miembro de este tipo de variable. –
Sí. Debe hacer bool x=false
o bool x(false)
. Las primitivas que no se inicializan pueden tener CUALQUIER valor.
ver wikipedia
o 'bool x = bool();' Funcionará también. –
Sí. SIEMPRE inicialice sus variables antes de su uso. Incluso si el lenguaje garantiza que tendrán valores específicos. Si no puede forzarse, obtenga un compilador que se quejará y luego hágalo. :)
Sin embargo, no inicializa los valores a menos que realmente tenga un significado para que se inicialicen. Por ejemplo, si usted tiene un bucle como este (no estoy diciendo que esto es un buen código, es sólo un ejemplo):
int i = 0;
while ((i = getNum()) == 5)
{
}
no inicializan a cero i
como lo hice. No tiene sentido, y si bien apaga el compilador, introduce la posibilidad de que lo olvide y luego su código se descompondrá. Si puede obligarse a iniciarse solo en el momento adecuado, ni más ni menos, entonces hará que la depuración sea muchísimo más fácil, ya que su wrong code will look wrong even at just a glance.
Por lo tanto, en una línea: nunca inicialice solo para evitar que el compilador se queje, pero siempre inicialícelo antes de usarlo.
Solo las variables globales tienen asignado 0 (falso) de forma predeterminada, a las variables locales se les asigna un valor de basura distinto de cero, que se evaluaría como verdadero en una variable booleana.
- 1. BackgroundWorker RunWorkerCompletedEventArgs.Cancelled siempre falsas
- 2. sd.canWrite() devuelve siempre falsas
- 3. ¿Por qué las variables en Java no son volátiles por defecto?
- 4. curl_exec() devuelve siempre falsas
- 5. ¿Opencl admite variables booleanas?
- 6. En MATLAB, ¿las variables REALMENTE son de doble precisión por defecto?
- 7. ¿Por qué las variables no utilizadas son malas?
- 8. Evaluación de las variables booleanas PL/SQL en Oracle Forms
- 9. ¿Las macros variables no son estándar?
- 10. Variables de pila y pila falsas
- 11. Si las condiciones son falsas, evite el valor predeterminado
- 12. ¿Por qué las variables protegidas no están permitidas por defecto en Checkstyle?
- 13. Formas mejores de encontrar si ambas variables son verdaderas o ambas son falsas
- 14. ¿Cuáles son las rutas que "requieren" busca por defecto?
- 15. ¿Las aserciones siempre son malas?
- 16. ¿Por qué las interfaces genéricas no son co/contravariantes por defecto?
- 17. ¿Por qué las funciones en Ocaml/F # no son recursivas por defecto?
- 18. ¿Por qué las clases no están selladas por defecto?
- 19. ¿Los constructores de Java no son públicos por defecto?
- 20. en C# son métodos privados por defecto?
- 21. SharedPreferences.getAll() no tiene claves de preferencia que son falsas. ¿Cómo recuperar todas las llaves?
- 22. algoritmo - minimizando las expresiones booleanas
- 23. ¿Qué son las variables estáticas?
- 24. ¿Qué son las variables puras?
- 25. Asegurando que las excepciones siempre son
- 26. Operador Java para comprobar si las condiciones son falsas, pero no ambas
- 27. Asp.Net MVC 2 Casilla siempre falsas en el modelo
- 28. ¿Las variables de instancia primitiva se inicializan por defecto en Objective-C?
- 29. ¿Las variables de instancia son las nuevas variables globales?
- 30. ¿Las devoluciones de llamada son siempre asincrónicas?
Por qué: http://stackoverflow.com/questions/1910832/c-why-arent-pointers-initialized-with-null-by-default/1910992#1910992 –
[Tenga en cuenta que la lectura de una variable no inicializada lleva a UB .] (http://stackoverflow.com/questions/4259885/why-do-i-see-strange-values-when-i-print-uninitialized-variables/4259991#4259991) Simplemente no lo hagas. – GManNickG
Un error "interesante" que puede aparecer en esta situación es tanto b como! B evaluando a verdadero –