Ir para conteúdo
Fórum Script Brasil
  • 0

Duvida do CODIGO


faker

Pergunta

Bom dia,

Estou iniciando estudo de c++, e claro como todo novato tem bastante duvida.

 

Gostaria de saber por que esse código imprime 3,1,3

 

j = 1 eu entendi, porque ele não soma nem incrementa nada
i= incrementa 3x, uma da duvida seria essa ele deveria incrementar infinitamente porque 'k' sempre sera maior que ´'i'
k= duvida tb

 

sei que a chave para o entendimento é o tal  "k=k+i%2;" não sei que seguinifica esse %2 do lado do i


#include <stdio.h>
int i,j,k;
int main() {
 for (i=0,j=1,k=2;i<k;i++) {
 k=k+i%2;
 }
 printf ("%d,%d,%d",i,j,k);
}

 

 

alguém poderia me ajudar?

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

O operador % que se chama "modulo", serve para obter o resto de uma divisão. Se ao usar o operador de divisão(/), para por exemplo dividir "int resultado = 5/2", o resultado seria igual a 2. Porem sobra 1 correto? E se isso for exatamente o que eu quero? Saber o resto da divisão, e não o valor? Então uso modulo. Então no "int resultado = 5%2" resultado seria 1. Com isso você já sabe para que serve o operador modulo.
 

Ao entrar no for por primeira vez(E só essa primeira vez), tanto i como k receben os valores de 0 e 1 respectivamente. logo começa a repetir k=k+i%2 até que se de a condição de i<k(i menor que k). Sendo assim a melhor estratégia para essas coisas é anotar em um papel tudo o que for acontecendo. E também é bom usar o proprio programa para ir imprimindo para nós os valores e assim ser possível a compreensão do problema. Isso mostro logo em seguida.

Outro ponto em destacar é que não sei se é do seu conhecimento porem os operadores tem uma prioridade, ao igual que em matemáticas, por exemplo / tem prioridade sobra + e -, etc. isso você pode ver nesta pagina:
https://pt.wikipedia.org/wiki/Operadores_em_C_e_C%2B%2B

Nesta tabela:
Screenshot_2.jpg.dd699614445c009b0f22fd00cfa14e0a.jpg

Por exemplo, na linha:
Screenshot_3.jpg.6cb9c615c3d6d6679523bf5d82eaac3f.jpg

o operador ++(incremento) tem prioridade sobre o operador --(decremento). Porque ++ esta primeiro. Porem ao mesmo tempo tanto o operador de incremento como o de decremento tem prioridade aos parêntesis pois o parêntesis se encontra mais abaixo na tabela. O que da para entender que a ordem de prioridades funciona mais ou menos desta forma:
Screenshot_4.jpg.a65855bb351fc840308bb55f80231630.jpg

ou seja que a ordem seria esta ++, --, (), [], ., ->... Acho que deu para entender como funciona as prioridades. Porque eu to explicando isso? Porque se você for na tabela, na sua expressão k=k+i%2  você tem 3 operadores =, + e o %. Esqueça o operador =, mas os operadores de soma e modulo, um tem maior prioridade que o outro, modulo tem prioridade ao operador de soma, então na parte de k+i%2 vai ter prioridade i%2, ou seja vai ser obtido o resultado de i%2 e o resultado disto seria somado a k. para ficar mais claro aconteceria isso  k=k+(i%2).

Agora vamos usar o próprio programa para que nos diga em cada momento o valor das variáveis. Para isso vamos alterar ele para imprimir ditos valores.

#include <stdio.h>
int i, j, k;
int main() {
    printf("Antes de entrar no main as variaveis i, j e k tem os seguintes valores:\n");
    printf("i=%d\n", i);
    printf("j=%d\n", j);
    printf("k=%d\n\n", k);
    
    //As variaveis i, j e k podem gerar numeros ao "azar", pois podem conter lixo já que podem 
    //ocupar o lugar na memoria que antes tivesse outro variavel de outro programa qualquer que 
    //tenha liberado esse espaço porem deixou lá seus valores antigos.
    
    for ( 
        //atribuição: Somente acontece uma vez pois não há logica em atribuir valores mais de 
        //uma vez para as variaveis que estiverem nesta parte
        i = 0, j = 1, k = 2,
        printf("Dentro do for as variaveis tomaram o valor de:\n"),
        printf("i=%d\n", i),
        printf("j=%d\n", j),
        printf("k=%d\n\n", k); 
        
        //condição: Acontece cada vez antes de entrar no corpo do for{}, por encuanto i for menor que k 
        // da verdadeiro(true), por encuanto tiver um true nesta parte o programa continua rodando. Se
        // i llegar a ser igual o maior que k será gerado um false, pois i n será menor que k, neste momento 
        //já n se executará mais o corpo do programa -> {k = k + i % 2;}. E i já não se incrementará mais no seguinte passo.  
        i < k; 
        
        //Alteração de valores:
        //Nesta parte se alteram os valores das variaveis conforme a necessidade do 
        //programador. Essa parte acontece todas as vezes que o for rodar, igual que a ultima 
        //parte. Importante! Esta depende da anterior, já que se for gerado um false na parte da condição
        //não chegará a entrar nesta.
        i++,
        printf("Agora seus valores são:\n"),
        printf("i=%d\n", i),
        printf("j=%d\n", j),
        printf("k=%d\n\n", k)
    
    ) {
        //Corpo do programa
        printf("A expressao k = k + i %% 2 é realizada\n");
        printf ("Antes da expresao %d = %d + %d %% 2 \n", k, k, i);
        k = k + i % 2;
        printf ("Depois da expresao %d = %d + %d %% 2 \n\n", k, k, i);
    }
    
    printf ( "%d,%d,%d", i, j, k );
}

 

Vou deixar aqui também o fonte, por que as vezes ao copiar código de esta pagina gera error, então neste caso melhor baixar o fonte.

http://cpp.sh/9b5fs
 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...