Faça o teste de mesa, passo a passo, identificando o valor das variáveis durante a execução. Observe atentamente a diferença entre passagem por valor e passagem por referência. Ao final, indique e contenham os valores de x, y, a e b.

Questão

Faça o teste de mesa, passo a passo, identificando o valor das variáveis durante a execução. Observe atentamente a diferença entre passagem por valor e passagem por referência. Ao final, indique e contenham os valores de x, y, a e b.

Imagem 1

Código (trecho do enunciado):

#include <iostream>
using namespace std;

void alteraValor(int a, int b) {
    a = a + 5;
    b = b * 2;
}

void alteraReferencia(int &a, int &b) {
    a = a + 5;
    b = b * 2;
}

int main() {
    int x = 7, y = 3;
    alteraValor(x, y);
    cout << x << " " << y << endl;
    alteraReferencia(x, y);
    cout << x << " " << y << endl;
    return 0;
}

Tabela (a ser preenchida no enunciado):

EtapaxyabObservação
Antes de alteraValor
Durante alteraValor
Após alteraValor
Durante alteraReferencia
Após alteraReferencia

Resposta

98%

Ao final: x = 12, y = 6. Na 1ª chamada (por valor): a = 12, b = 6 apenas dentro da função. Na 2ª chamada (por referência): a e b são aliases de x e y, então x e y mudam para 12 e 6.

Explicação

Vamos acompanhar a execução e distinguir passagem por valor (cópia) de passagem por referência (apelido/alias da variável original).

1) Estado inicial (main)

No main:

  • x=7x = 7
  • y=3y = 3

Ainda não existem os parâmetros a e b (eles só existem dentro das funções).

2) Chamada alteraValor(x, y) (passagem por valor)

Assinatura: void alteraValor(int a, int b).

Antes / no início da função

Ao chamar alteraValor(x, y), ocorre cópia dos valores:

  • a recebe uma cópia de xa=7a = 7
  • b recebe uma cópia de yb=3b = 3
  • x e y continuam: x=7x = 7, y=3y = 3

Durante alteraValor

Executando as linhas:

  1. a = a + 5;a=7+5=12a = 7 + 5 = 12
  2. b = b * 2;b=32=6b = 3 \cdot 2 = 6

Importante: como a e b são cópias, somente eles mudam; x e y não são afetados.

Após alteraValor

A função termina e a e b deixam de existir.

  • x=7x = 7
  • y=3y = 3

Por isso o primeiro cout imprime:

  • 7 3

3) Chamada alteraReferencia(x, y) (passagem por referência)

Assinatura: void alteraReferencia(int &a, int &b).

Aqui a e b são referências, isto é:

  • a é um apelido de x
  • b é um apelido de y

Durante alteraReferencia

Antes de executar as operações (no momento da entrada na função):

  • x=7x = 7, y=3y = 3
  • aa referencia xxa=7a = 7
  • bb referencia yyb=3b = 3

Executando as linhas:

  1. a = a + 5; altera o mesmo local de xx=7+5=12x = 7 + 5 = 12 (logo a=12a = 12 também)
  2. b = b * 2; altera o mesmo local de yy=32=6y = 3 \cdot 2 = 6 (logo b=6b = 6 também)

Após alteraReferencia

A função termina; a e b deixam de existir, mas as alterações em x e y permanecem:

  • x=12x = 12
  • y=6y = 6

Por isso o segundo cout imprime:

  • 12 6

Tabela preenchida

EtapaxyabObservação
Antes de alteraValor73a e b ainda não existem (fora da função)
Durante alteraValor73126a e b são cópias (por valor); x e y não mudam
Após alteraValor73ao sair da função, a e b somem; x e y seguem 7 e 3
Durante alteraReferencia126126a referencia x e b referencia y; mudanças refletem em x e y
Após alteraReferencia126ao sair, x e y permanecem alterados

Conclusão final: x=12x = 12, y=6y = 6. Na chamada por valor, apenas a=12 e b=6 internamente; na chamada por referência, x e y tornam-se 12 e 6.

Alternativa correta: (não há alternativas).

Travou em outra questão? A gente resolve.

Crie sua conta grátis e resolva 3 questões por dia com explicação passo a passo, por texto ou foto.

Questões relacionadas

Ver últimas questões

Comece a estudar de forma inteligente hoje mesmo

Resolva questões de concursos e vestibulares com IA, gere simulados personalizados e domine os conteúdos que mais caem nas provas.

Cancele quando quiser.