Pregunta Inicializando variables en C


Sé que a veces si no inicializas un int, obtendrá un número aleatorio si imprime el número entero.

Pero inicializar todo a cero parece algo tonto.

Lo pregunto porque estoy comentando mi proyecto C y soy bastante directo en la sangría y compila completamente (90/90 gracias Stackoverflow) pero quiero obtener 10/10 en los puntos de estilo.

Entonces, la pregunta: cuándo es apropiado inicializar, y cuándo debería declarar una variable:

int a = 0;

vs.

int a;

17
2017-11-02 01:57


origen


Respuestas:


Una regla que no se ha mencionado aún es la siguiente: cuando la variable se declara dentro de una función, no se inicializa, y cuando se declara en alcance estático o global se establece en 0:

int a; // is set to 0

void foo() {
  int b;  // set to whatever happens to be in memory there
}

Sin embargo, para la legibilidad, normalmente inicializaba todo en el momento de la declaración.

Si estás interesado en aprender este tipo de cosas en detalle, te recomendaría esta presentación y este libro


20
2017-11-02 02:12



Hay varias circunstancias donde no debería inicializar una variable:

  1. Cuando tiene una duración de almacenamiento estática (static palabra clave o var global) y quiere que el valor inicial sea cero. La mayoría de los compiladores realmente almacenan ceros en el binario si se inicializa explícitamente, lo que generalmente es solo una pérdida de espacio (posiblemente un gran desperdicio para arreglos grandes).
  2. Cuando pasará inmediatamente la dirección de la variable a otra función que llena su valor. Aquí, inicializar es solo una pérdida de tiempo y puede ser confuso para los lectores del código que se preguntan por qué está almacenando algo en una variable que está a punto de sobrescribirse.
  3. Cuando no se puede determinar un valor significativo para la variable hasta que el código subsiguiente haya completado la ejecución. En este caso, es activamente dañino inicializar la variable con un valor ficticio como cero / NULO, ya que evita que el compilador te advierta si tiene algunas rutas de código donde nunca se asigna un valor significativo. Los compiladores son buenos para advertirle sobre el acceso a variables no inicializadas, pero no pueden advertirle sobre las variables "todavía contiene valores ficticios".

Aparte de estos problemas, yo diría que generalmente es una buena práctica inicializar las variables no estáticas cuando sea posible.


31
2017-11-02 06:54



Si la variable está dentro del alcance de una función y no es miembro de una clase I siempre inicialízalo porque de lo contrario recibirás advertencias. Incluso si esta variable se usará más tarde, prefiero asignarla en la declaración.

En cuanto a las variables miembro, debe inicializarlas en el constructor de su clase.

Para punteros, siempre inicialízalos a algunos valores predeterminados, particularmente NULL, incluso si se van a utilizar más adelante, son peligrosos cuando no se inicializan.

También se recomienda construir su código con el nivel más alto de advertencias que admita su compilador, ayuda a identificar malas prácticas y posibles errores.


5
2017-11-02 02:09



Las variables estáticas y globales se inicializarán a cero para que pueda omitir la inicialización. Las variables automáticas (por ejemplo, variables no estáticas definidas en el cuerpo de la función) pueden contener basura y, probablemente, siempre deben inicializarse.

Si hay un valor específico distinto de cero que necesita en la inicialización, entonces siempre debe inicializarlo explícitamente.


5
2017-11-02 02:07



Puedo pensar en un par de razones fuera de mi cabeza:

  1. Cuando va a inicializarlo más adelante en su código.

    int x;
    
    if(condition)
    {
        func();
        x = 2;
    }
    else
    {
       x = 3;
    }
    anotherFunc(x); // x will have been set a value no matter what
    
  2. Cuando necesita algo de memoria para almacenar un valor establecido por una función u otra pieza de código:

    int x;  // Would be pointless to give x a value here
    scanf("%d", &x);
    

4
2017-11-02 02:01



Siempre es una buena práctica inicializar sus variables, pero a veces no es estrictamente necesario. Considera lo siguiente:

int a;
for (a = 0; a < 10; a++) { } // a is initialized later

o

void myfunc(int& num) {
  num = 10;
}

int a;
myfunc(&a); // myfunc sets, but does not read, the value in a

o

char a;
cin >> a; // perhaps the most common example in code of where
          // initialization isn't strictly necessary

Estos son solo algunos ejemplos en los que no es estrictamente necesario inicializar una variable, ya que se establece más tarde (pero no se accede entre la declaración y la inicialización).

En general, sin embargo, no hace daño inicializar siempre tus variables en la declaración (y de hecho, esta es probablemente la mejor práctica).


3
2017-11-02 02:06



En general, no hay necesidad de inicializar una variable, con 2 excepciones notables:

  1. Usted declara un puntero (y no lo asigna de inmediato) - usted siempre debe establecer estos a NULL como buen estilo y defensiva programación.
  2. Si, cuando declaras la variable, ya sabes     qué valor se le asignará. Las asignaciones adicionales se agotan     más ciclos de CPU.

Más allá de eso, se trata de colocar las variables en el estado correcto en el que las desea para la operación que va a realizar. Si no va a leerlos antes de que una operación cambie su valor (ya la operación no le importa en qué estado se encuentre), no es necesario inicializarlos.

Personalmente, siempre me gusta inicializarlos de todos modos; si olvidó asignarle un valor, y se transfiere a una función por error (como la longitud restante de la memoria intermedia) 0 generalmente se maneja limpiamente, 32532556 no.


2
2017-11-02 02:07