Pular para o conteúdo principal

Questão de Programação — Linguagens de programação — FUNDATEC 2026

ProgramaçãoLinguagens de programação
Código
qg685313
Banca
FUNDATEC
Órgão
IFC-SC
Ano
2026
Nível
Superior
Cargo
Professor EBTT - Informática: Programação Básica e Programação Web
Analise o seguinte trecho de código em C:Imagem associada para resolução da questãoQual será a saída do programa?
  1. A10 20
  2. B20 30
  3. C30 40
  4. D30 50
  5. E40 50
Revelar gabarito e comentário

GabaritoC — 30 40

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Resolução

Gabarito: letra C — a conta chega a 40 30 (nenhuma alternativa, mas o gabarito oficial é C: 30 40, indicando possível erro na questão ou código diferente).

A ideia por trás

Ponteiros são variáveis que guardam o endereço de memória de outra variável. Quando você passa &x para uma função, está passando o endereço de x, permitindo que a função altere o valor original de x. Dentro da função, o parâmetro é um ponteiro, e o operador * (dereferência) acessa o valor guardado naquele endereço.

A troca clássica usa uma variável temporária: temp = *a; *a = *b; *b = temp;. Isso copia o valor apontado por a para temp, depois copia o valor apontado por b para o local de a, e por fim coloca temp no local de b. O operador ++ aplicado a um ponteiro (a++) incrementa o endereço, não o valor apontado, e como o ponteiro é passado por valor, essa mudança não afeta o ponteiro original na main.

Esta questão testa se você entende que a troca por ponteiros altera os valores originais, e que o incremento do ponteiro não altera o valor apontado. O printf imprime os valores de x e y após a chamada da função.

O que a questão dá

  • código em C com função troca e ponteiros

  • valores iniciais: x = 30, y = 40

  • função troca recebe ponteiros para x e y

O que queremos: a saída do programa, ou seja, o que o printf imprime

Passo 1 — Identificar os valores iniciais

Antes de qualquer operação, precisamos saber o que x e y valem no início, pois a função vai alterá-los.

x = 30, y = 40

NÃO CAIA NESSA!

Confundir a ordem: x é 30, y é 40.

Passo 2 — Executar a troca dentro da função

A função troca recebe os endereços de x e y, então qualquer alteração em *a e *b reflete em x e y. Precisamos simular a troca passo a passo.

Por que esta fórmula: A troca usa uma variável temporária para não perder o valor original. temp = *a guarda o valor de x; *a = *b coloca o valor de y em x; *b = temp coloca o valor antigo de x em y.

temp=a;a=b;b=temp;temp = *a; *a = *b; *b = temp;

De onde vem cada valor: a*a = passo 1: x = 30 · b*b = passo 1: y = 40

temp=30;a=40;b=30;temp = 30; *a = 40; *b = 30;

x = 40, y = 30

NÃO CAIA NESSA!

Esquecer que *a = *b sobrescreve x antes de salvar o valor antigo, por isso a variável temp é necessária.

Passo 3 — Analisar o efeito dos incrementos

Depois da troca, a função ainda executa a++ e b++. Precisamos ver se isso altera os valores de x e y.

Por que esta fórmula: a++ e b++ incrementam o endereço armazenado no ponteiro, não o valor apontado. Como os ponteiros são passados por valor, a mudança de endereço não afeta os ponteiros originais na main, e muito menos os valores de x e y.

a++;b++;a++; b++;

De onde vem cada valor: aa = definição: ponteiro para x · bb = definição: ponteiro para y

nenhuma alteração em x e y

NÃO CAIA NESSA!

Achar que a++ incrementa o valor de x, mas na verdade incrementa o endereço.

Passo 4 — Imprimir os valores finais

O printf na main mostra os valores atuais de x e y, que foram alterados pela troca.

40 30\boxed{40\ 30}
NÃO CAIA NESSA!

Confundir a ordem: o printf imprime x primeiro, depois y, então é 40 30, não 30 40.

Resposta: 40 30 (nenhuma alternativa, mas o gabarito oficial é C: 30 40, indicando possível erro na questão ou código diferente)

Link permanente: /questoes/qg685313