João pretendia escrever um trecho de código na linguagem C ...

Próximas questões
Com base no mesmo assunto
Q2249331 Programação
João pretendia escrever um trecho de código na linguagem C contendo o seguinte loop:
    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.
Alternativas

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