Errori, bug, domande - pagina 2889

 
A100:

Tu hai un numero casuale 0, io ho 540016640

ma sono comunque numeri casuali.

Pensavo che la MQ fosse azzerata.

 
Roman:

Pensavo che la MQ fosse stata azzerata.

Le variabili globali sembrano essere inizializzate con zero, ma ho visto diverse inizializzazioni nel corpo delle funzioni al primo passaggio. Cerco di inizializzare sempre prima dell'uso. Anche se sono d'accordo, il comportamento deve essere inequivocabile.

E un'altra dichiarazione nel corpo del ciclo, tra parentesi, rende la variabile locale al ciclo. Solo che non è nei documenti.

 
Roman:

Inoltre, il compilatore non avverte che la variabile non è inizializzata.

Print(...) potrebbe non avvertire come se il parametro fosse passato da un riferimento non costante

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

Se i cicli sono gli stessi, allora il comportamento del compilatore dovrebbe essere lo stesso, ed è diverso. È qui che si trova l'errore. Hai spiegato perché c'è un avvertimento nel caso (1), allora spiega perché non c'è nel caso (2)? Cosa è cambiato in linea di principio? E poi, se viene usata una variabile non inizializzata, perché il risultato finale è giusto quando si esegue il codice?

Esiste una tale scienza - la logica. Se A e B sono uguali e A è rosso, anche B deve essere rosso, non verde

Non ho studiato programmazione, posso solo speculare logicamente, come Vasily Ivanovich e Petka speculavano sulla logica.

Nel primo caso viene eseguita l'intera stringa

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

e qui la variabile j non è inizializzata, ma il suo valore è assegnato alla variabile i

Nel secondo caso, anche se la variabile j non è inizializzata, nella riga successiva in cui viene usata, non viene assegnato il suo valore, ma il suo valore sì. In altre parole, la variabile j è inizializzata con il valore della variabile i

Ecco una variante senza avvertimenti

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

Non ho studiato per essere un programmatore, posso solo speculare logicamente, come Vasily Ivanovich e Petka speculavano sulla logica.

Nel primo caso viene eseguita l'intera stringa

e qui la variabile j non è inizializzata, ma il suo valore è assegnato alla variabile i

E chi l'ha studiato? Penso che la maggior parte delle persone qui (come me) siano autodidatti.

È necessario studiare l'operatore for loop per capire la sequenza delle operazioni. In (1), alla variabile j viene assegnato il valore di i+1

j = i+1

prima che appaia a destra dell'operatore di assegnazione

i = j
 
Valeriy Yastremskiy:

Le variabili globali sembrano essere inizializzate con zero, ma il corpo della funzione ha incontrato inizializzazioni diverse al primo passaggio.
Cerco sempre di inizializzare prima dell'uso. Anche se sono d'accordo, il comportamento dovrebbe essere inequivocabile.

E un'altra dichiarazione nel corpo del ciclo, tra parentesi, rende la variabile locale al ciclo. I dottori semplicemente non ce l'hanno.

Sì, anch'io inizializzo sempre le variabili, è come due volte due,dovrei ricordarmelo sempre.
Mi è entrato in testa dal linguaggio C ))
Quindi questo esempio di un ciclo con una variabile non inizializzata è una cattiva pratica.

 
Roman:

Sì, anch'io inizializzo sempre le variabili, è come due volte due,bisogna ricordarlo sempre.
Mi è entrato in testa dal linguaggio C ))
Quindi questo esempio di un ciclo con una variabile non inizializzata è una cattiva pratica.

È necessario inizializzarlo, ma solo con un valore significativo. Non c'è questo valore nell'esempio precedente, quindi non è una cattiva pratica ed è l'unico modo possibile. Altrimenti ci sarebbe una doppia inizializzazione

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

Inizializzare, ma solo con un valore significativo. Non c'è un valore simile nell'esempio precedente, quindi la pratica non è cattiva, è l'unica possibile. Altrimenti ci sarebbe una doppia inizializzazione

Cosa cambierebbe se inizializzaste

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

Cosa cambierebbe se fosse inizializzato con j=333?

E perché da zero e non da j=333 diciamo? Cioè è un'inizializzazione senza senso che può nascondere un errore difficile da trovare

 
A100:

Perché zero e non 333, diciamo? Cioè è un'inizializzazione senza senso che può nascondere un errore difficile da catturare

Se avete bisogno di catturare un errore di questo valore, beh, inizializzatelo con 333 ))
È solo un valore iniziale.