João pretendia escrever um trecho de código na linguagem C ...
int i; for (i = 5; i >= 0; i = i - 1) { printf("Valor: %d\n", i); }
Entretanto, sem querer, João inverteu a ordem das expressões no comando for, e digitou o código como segue:
int i; for (i = 5; i = i - 1; i >= 0) { printf("Valor: %d\n", i); }
Assinale a lista completa dos valores exibidos nesse trecho pela execução da versão equivocada produzida por João.
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa Correta: A - 4, 3, 2, 1
Tema Central: A questão aborda a execução de um laço de repetição (loop) na linguagem de programação C, destacando a importância da ordem das expressões no comando for
. O candidato precisa compreender como as expressões no for
controlam a inicialização, a condição de continuidade e o incremento/decremento do laço.
Justificativa da Alternativa Correta: A questão descreve que João inverteu a ordem das expressões no for
. Normalmente, o for
é estruturado como for (inicialização; condição; incremento/decremento)
. No código invertido, João escreveu for (i = 5; i = i - 1; i >= 0)
. Aqui, a primeira expressão é a inicialização i = 5
, mas a segunda expressão, i = i - 1
, que deveria ser a condição, na verdade, diminui o valor de i
a cada iteração. Como resultado, i
começa em 5 e imediatamente é decrementado para 4, fazendo com que o laço imprima os valores 4, 3, 2 e 1 antes de terminar. Por isso, a lista de valores exibidos pela execução do código é 4, 3, 2, 1.
Análise das Alternativas Incorretas:
B - 4, 3, 2, 1, 0: Esta alternativa consideraria que a condição de término do laço i >= 0
foi executada corretamente. No entanto, devido à ordem invertida, o laço não chega a verificar se i
é maior ou igual a 0 antes de imprimir o 0.
C - 5: Supõe que o laço somente executa uma vez imprimindo o início do valor i = 5
. Contudo, devido à lógica de decremento como condição, 5 nunca é impresso.
D - 5, 4, 3, 2, 1 e E - 5, 4, 3, 2, 1, 0: Ambas assumem que o valor 5 é impresso primeiro, o que não acontece devido ao decremento imediato após a inicialização.
Gostou do comentário? Deixe sua avaliação aqui embaixo!
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
gabarito ta errado, né? seria letra E
Esta certo !
A sintaxe é a seguinte:
for( inicio_do_laço ; condição ; termino_de_cada_iteração)
{
//código a ser
//executado aqui
}
Isso quer dizer que, ao iniciar o laço for, ele faz o que está no trecho "inicio_do_laço".
Geralmente se usa para inicializar algumas variáveis (o que fazíamos antes de iniciar o laço WHILE).
Após inicializar, o for testa a condição.
Se ela resultar verdadeira, o código é executado e em seguida o 'termino_de_cada_iteração" é executado.
A condição é testada novamente, e se for verdadeira, executa o 'termino_de_cada_iteração" também, e assim continua até que a condição resulte no valor lógico FALSO (0) e o laço FOR termina.
Impressão normal
Valor: 5
Valor: 4
Valor: 3
Valor: 2
Valor: 1
Valor: 0
Impressão com as posição trocada
Valor: 4
Valor: 3
Valor: 2
Valor: 1
- Execução do Loop: resulta em . Esta é a primeira iteração.
- Como a expressão retorna o valor de , que é 4 (não zero), a condição é considerada verdadeira, e o loop continua.
- Na próxima iteração, resulta em .
- Isso continua até que chegue a 0. No entanto, como a expressão retorna o novo valor de , que é 0 (considerado falso em condições de controle de loops), o loop é interrompido antes de imprimir o valor 0.
fonte: chatgpt
(Comentário abaixo foi verificado no DevC++)
A resposta oficial está correta, mas há muito mais em jogo do que seria esperado!
O problema original (com i=i-1): neste caso a última expressão ( i>=0) nunca é checada, o que pode ser provado usando dois códigos:
Código 01:
#include <stdio.h>
int main()
{
int i,j=1;
for(i=8;i=i-2;i>=0) {
printf("Iteracao: %d\n",j);
printf("Valor i: %d\n",i);
j++;
}
return 0;
}
Que terá impressão:
Iteracao: 1
Valor i: 6 (donde a redução de 2 unidades é imediata, assim como seria de 1 unidade, comportamento diferente de i--, como imaginado e comprovado abaixo)
Iteracao: 2
Valor i: 4
Iteracao: 3
Valor i: 2 (e imediatamente o zero fará com que (i=8;0;whatever) tenha o loop abortado.
Código 02:
#include <stdio.h>
int main()
{
int i,j=1;
for(i=5;i=i-3;i>=0) {
printf("Iteracao: %d\n",j);
printf("Valor i: %d\n",i);
j++;
}
return 0;
}
Aqui temos looping infinito, porque de i=1 passa-se para i=-1, donde nunca se tem a saída do loop porque temos
(i=5, i nunca zero, whatever), onde whatever nunca é avaliado.
Finalmente em relação ao caso mais interessante, que seria trocar i=i-1 por i--, teremos:
Código 03:
#include <stdio.h>
int main()
{
int i,j=1;
for(i=5;i--;i>=0) {
printf("Iteracao: %d\n",j);
printf("Valor i: %d\n",i);
j++;
}
return 0;
}
Impressão:
Iteracao: 1
Valor i: 4
Iteracao: 2
Valor i: 3
Iteracao: 3
Valor i: 2
Iteracao: 4
Valor i: 1
Iteracao: 5
Valor i: 0
Aqui percebemos que a resposta correta seria B, o que impressiona: as expressões i -- e i = i-1 não são idênticas!
O que ocorre no código apresentado pelo examinador é o "normal", ou seja, i=i-1 imediatamente decresce o valor do contador, como todos esperam. Por outro lado, se tivéssemos i--, devemos seguir a lei do decréscimo postergado, ou seja, atribui-se o valor de i "prévio" na avaliação booleana e, só depois disso, realizamos o decréscimo!
Em termos práticos: quando estamos na 5a iteração, (sendo a 1a sinônimo de "entrada no loop") temos i=1. Daí como 1 não é zero, então a "condição" i-- é avaliada como verdadeira, DAÍ (e só então, já DENTRO do loop) i passa a valer 0, que será impresso como tal (ie, como 0).
Na 6a (potencial) iteração, temos i=0 ANTES de passar pelo i-- donde, AGORA, a condição i-- será falsa, saindo do loop sem imprimir "esse segundo" zero!
(Estou ciente de que praticamente ninguém lerá essas explicações. Vida que segue.)
Você deve estar se perguntando por que não vai até 0 se na última condição do for existe uma comparação >=0, né? Você deve saber que a estrutura do for é a seguinte:
for (inicialização; condição; incremento/decremento)
E como você deve ter percebido, João trocou a ordem de condição com o decremento. E como a expressão de condição é um decremento, ele vai entender que todo valor maior que 0 é verdadeiro, e todo valor menor ou igual a zero passa a ser falso.
1: i=5; i=5-1; i=4 (imprime 4)
2: i=4; i=4-1; i=3 (imprime 3)
3: i=3; i=3-1; i=2 (imprime 2)
4: i=2; i=2-1; i=1 (imprime 1)
5: i=1; i=1-1; i=0 (como i=0, ele retorna falso e finaliza o for, imprimindo 4, 3, 2, 1.)
Fonte: os livros acadêmicos mesmo, como faziam os astecas.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo