Errores, fallos, preguntas - página 2889

 
A100:

Usted tiene un número 0 al azar, yo tengo 540016640

pero siguen siendo números aleatorios.

Creía que el MQ estaba a cero.

 
Roman:

Creía que el MQ estaba a cero.

Con las variables globales parece que se inicializan con cero, pero en el cuerpo de las funciones me he encontrado con diferentes inicializaciones en la primera pasada. Trato de inicializar siempre antes de usarla. Aunque estoy de acuerdo, el comportamiento debe ser inequívoco.

Y otra declaración en el cuerpo del bucle, entre paréntesis, hace que la variable sea local al bucle. Simplemente no está en los documentos.

 
Roman:

Además, el compilador no advierte que la variable no está inicializada.

Print(...) puede no avisar como si el parámetro fuera pasado por una referencia no constante

int f( int& i ) { return i; }
void OnStart()
{
        int i;  
        f( i ); //нормально
}
 
A100:

Si los bucles son los mismos, entonces el comportamiento del compilador debería ser el mismo, y es diferente. Aquí es donde está el error. Has explicado por qué hay una advertencia en el caso (1), entonces explica por qué no la hay en el caso (2) ? ¿Qué ha cambiado en principio? Y entonces, si se utiliza una variable no inicializada, ¿por qué el resultado final es correcto al ejecutar el código?

Existe esa ciencia: la lógica. Si A y B son iguales y A es rojo, B también debe ser rojo, no verde

No he estudiado programación, sólo puedo especular lógicamente, como Vasili Ivanovich y Petka especularon sobre la lógica.

En el primer caso se ejecuta la cadena completa

for ( int i = 0, j; i < 10; i = j )

y aquí la variable j no se inicializa, sino que su valor se asigna a la variable i

En el segundo caso, aunque la variable j no está inicializada, en la siguiente línea en la que se utiliza, no se asigna su valor, pero sí su valor. Es decir, la variable j se inicializa con el valor de la variable i

Aquí hay una variante sin advertencias también

  for(int i = 0, j; i < 10; j = i)
   {
    j = i+1;
   }
 
Alexey Viktorov:

No estudié para ser programador, sólo puedo especular lógicamente, como Vasili Ivanovich y Petka especularon sobre la lógica.

En el primer caso se ejecuta la cadena completa

y aquí la variable j no se inicializa, sino que su valor se asigna a la variable i

¿Y quién lo ha estudiado? Creo que la mayoría de la gente aquí (como yo) es autodidacta.

Es necesario estudiar el operador de bucle for para entender la secuencia de operaciones. En (1), a la variable j se le asigna el valor de i+1

j = i+1

antes de que aparezca a la derecha del operador de asignación

i = j
 
Valeriy Yastremskiy:

Las variables globales parecen estar inicializadas con cero, pero el cuerpo de la función ha encontrado diferentes inicializaciones en la primera pasada.
Siempre intento inicializarlo antes de usarlo. Aunque estoy de acuerdo, el comportamiento debe ser inequívoco.

Y otra declaración en el cuerpo del bucle, entre paréntesis, hace que la variable sea local al bucle. Los doctores simplemente no lo tienen.

Sí, yo también inicializo siempre las variables, es como dos veces dos,debería recordarlo siempre.
Se me metió en la cabeza desde el lenguaje C ))
Así que este ejemplo de un bucle con una variable no inicializada es una mala práctica.

 
Roman:

Sí, yo también inicializo siempre las variables, es como dos por dos,hay que recordarlo siempre.
Se me metió en la cabeza desde el lenguaje C ))
Así que este ejemplo de un bucle con una variable no inicializada es una mala práctica.

Hay que inicializarlo pero sólo con un valor significativo. En el ejemplo anterior no existe ese valor, por lo que no es una mala práctica y es la única forma posible. De lo contrario, habría una doble inicialización

int f( int i ) { /*вычисления*/ }
void g( int k )
{
        for ( int i = 0, j; i < k; i = j )
        {
                j = f( i );
                /*вычисления*/
        }
}
 
A100:

Inicializar, pero sólo con un valor significativo. En el ejemplo anterior no existe ese valor, por lo que la práctica no es mala, es la única posible. De lo contrario, habría una doble inicialización

¿Qué cambiaría si se inicializa

int f( int i ) { /*вычисления*/ }
void g( int k )
{
   for ( int i=0, j=0; i < k; i = j )
   {
      j = f( i );
      /*вычисления*/
   }
}       
 
Roman:

¿Qué cambiaría si se inicializara con j=333?

¿Y por qué por cero y no j=333 digamos? Es decir, es una inicialización sin sentido que puede esconder un error difícil de encontrar

 
A100:

¿Por qué cero y no 333, digamos? Es decir, es una inicialización sin sentido que puede ocultar un error difícil de detectar

Si necesitas atrapar un error de este valor, pues inicialízalo con 333 ))
Es sólo un valor de inicio.

Razón de la queja: