Erros, bugs, perguntas - página 2889

 
A100:

Você tem um número aleatório 0, eu tenho 540016640

mas continuam a ser números aleatórios.

Pensei que a MQ estava zerada.

 
Roman:

Pensei que a MQ estava zerada.

As variáveis globais parecem ser inicializadas com zero, mas tenho visto inicializações diferentes no corpo de funções na primeira passagem. Tento sempre inicializar antes de usar. Embora eu concorde, o comportamento deve ser inequívoco.

E outra declaração no corpo do laço, entre parênteses, torna a variável local ao laço. Só não está nos documentos.

 
Roman:

Além disso, o compilador não avisa que a variável não é inicializada.

Imprimir(...) não pode avisá-lo como se o parâmetro fosse passado por uma referência não-constante

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

Se os loops forem os mesmos, então o comportamento do compilador deve ser o mesmo, e é diferente. É aqui que reside o erro. Explicou porque existe um aviso no caso (1), depois explique porque não existe um no caso (2) ? O que mudou em princípio? E então, se uma variável não inicializada é utilizada, porque é que o resultado final é correcto ao executar o código?

Existe uma tal ciência - lógica. Se A e B são os mesmos e A é vermelho, B também deve ser vermelho, não verde

Não estudei programação, só posso especular logicamente, como Vasily Ivanovich e Petka especularam em lógica.

No primeiro caso, toda a cadeia é executada

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

e aqui a variável j não é inicializada, mas o seu valor é atribuído à variável i

No segundo caso, mesmo que a variável j não seja inicializada, na linha seguinte onde é utilizada, não é atribuído o seu valor, mas sim o seu valor. Por outras palavras, a variável j é inicializada com o valor da variável i

Aqui está também uma variante sem avisos

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

Não estudei para ser um programador, só posso especular logicamente, como Vasily Ivanovich e Petka especularam sobre a lógica.

No primeiro caso, toda a cadeia é executada

e aqui a variável j não é inicializada, mas o seu valor é atribuído à variável i

E quem o estudou? Penso que a maioria das pessoas aqui (como eu) são autodidactas.

É necessário estudar o para operador de laço para compreender a sequência de operações. Em (1 ), é atribuído à variável j o valor de i+1

j = i+1

antes de aparecer à direita do operador de cessão

i = j
 
Valeriy Yastremskiy:

As variáveis globais parecem ter sido inicializadas com zero, mas o corpo da função encontrou diferentes inicializações na primeira passagem.
Tento sempre inicializar antes de usar. Embora eu concorde, o comportamento deve ser inequívoco.

E outra declaração no corpo do laço, entre parênteses, torna a variável local ao laço. Os docs simplesmente não o têm.

Sim, eu também inicializo sempre as variáveis, é como duas vezes duas,devo sempre lembrar-me.
Apanhei-o na minha cabeça a partir da língua C )
Portanto, este exemplo de um loop com uma variável não inicializada é uma má prática.

 
Roman:

Sim, eu também inicializo sempre variáveis, é como duas vezes duas,tenho de me lembrar sempre.
Apanhei-o na minha cabeça a partir da língua C )
Portanto, este exemplo de um loop com uma variável não inicializada é uma má prática.

É necessário inicializá-lo, mas apenas com um valor significativo. Não existe tal valor no exemplo acima, por isso não é uma má prática e é a única forma possível. Caso contrário, haveria uma dupla inicialização

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

Inicializar, mas apenas com um valor significativo. Não existe tal valor no exemplo acima, por isso a prática não é má, é a única possível. Caso contrário, haveria uma dupla inicialização

O que mudaria se fosse rubricado

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

O que mudaria se fosse rubricado com j=333?

E porquê por zero e não por j=333, digamos? Ou seja, é uma inicialização sem sentido que pode esconder um erro difícil de encontrar

 
A100:

Porquê zero e não 333, digamos? Ou seja, é uma inicialização sem sentido que pode esconder um erro difícil de apanhar

Se precisar de apanhar um erro deste valor, bem, inicialize-o com 333 ))
É apenas um valor inicial.