Questão nº 61
Questão de Tecnologia da Informação · FGV ALEP 2024 (nº 61)
Seja o seguinte código escrito em linguagem C:
#include <stdio.h>
int main()
{
int i;
for (i=0; i<5; i++) printf("%u\n",++i<<2);
return 0;
}
Assinale a opção que indica o que será impresso no console padrão de saída pelo programa.
- A0 0 1
- B0 1 2 3 4
- C0 4 8 12 16
- D0 8 16
- E4 12 20 (alternativa correta)
Resposta comentada
Gabarito Alternativa E
Em C, uma variável pode ser modificada múltiplas vezes dentro de uma única iteração de um loop, especialmente quando operadores de incremento (++) são usados tanto na expressão a ser avaliada quanto na própria estrutura de controle do loop. Isso gera um efeito colateral, onde o valor da variável muda de forma não óbvia se não for rastreado cuidadosamente.
- (A) Incorreta: Esta opção não considera o incremento duplo da variável
inem a operação de deslocamento de bits (<<2), que multiplica o valor por 4. - (B) Incorreta: Esta seria a saída se o código fosse
for (i=0; i<5; i++) printf("%d\n", i);, ou seja, seifosse impresso diretamente e incrementado apenas uma vez por iteração. A armadilha aqui é ignorar o++identro doprintfe o<<2. - (C) Incorreta: Esta opção considera a multiplicação por 4 (
<<2), mas ignora o incremento duplo da variávelia cada iteração. Seifosse incrementado apenas uma vez por iteração (i++noforeinoprintf), a sequência seria 0, 4, 8, 12, 16 (paraide 0 a 4). - (D) Incorreta: Esta opção não corresponde à lógica de incremento duplo e deslocamento de bits.
- (E) Correta: Vamos rastrear o valor de
ie a saída:- Início:
i = 0. - 1ª iteração:
- Condição
i < 5(0 < 5) é verdadeira. - Dentro do
printf:++ié avaliado primeiro.ise torna 1. - A expressão
1 << 2(1 multiplicado por ) resulta em 4. printfimprime4.- Após o corpo do loop, o
i++doforé executado.ise torna 2.
- Condição
- 2ª iteração:
- Condição
i < 5(2 < 5) é verdadeira. - Dentro do
printf:++ié avaliado.ise torna 3. - A expressão
3 << 2(3 multiplicado por 4) resulta em 12. printfimprime12.- Após o corpo do loop, o
i++doforé executado.ise torna 4.
- Condição
- 3ª iteração:
- Condição
i < 5(4 < 5) é verdadeira. - Dentro do
printf:++ié avaliado.ise torna 5. - A expressão
5 << 2(5 multiplicado por 4) resulta em 20. printfimprime20.- Após o corpo do loop, o
i++doforé executado.ise torna 6.
- Condição
- 4ª iteração:
- Condição
i < 5(6 < 5) é falsa. O loop termina.
Portanto, a saída é4,12,20.
- Condição
- Início:
Fonte: FGV ALEP 2024 Analista Legislativo - Desenvolvedor de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.