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.
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):
| Etapa | x | y | a | b | Observaçã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:
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:
arecebe uma cópia dex⇒brecebe uma cópia dey⇒xeycontinuam: ,
Durante alteraValor
Executando as linhas:
a = a + 5;⇒b = b * 2;⇒
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.
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 dexbé um apelido dey
Durante alteraReferencia
Antes de executar as operações (no momento da entrada na função):
- ,
- referencia ⇒
- referencia ⇒
Executando as linhas:
a = a + 5;altera o mesmo local dex⇒ (logo também)b = b * 2;altera o mesmo local dey⇒ (logo também)
Após alteraReferencia
A função termina; a e b deixam de existir, mas as alterações em x e y permanecem:
Por isso o segundo cout imprime:
12 6
Tabela preenchida
| Etapa | x | y | a | b | Observação |
|---|---|---|---|---|---|
| Antes de alteraValor | 7 | 3 | — | — | a e b ainda não existem (fora da função) |
| Durante alteraValor | 7 | 3 | 12 | 6 | a e b são cópias (por valor); x e y não mudam |
| Após alteraValor | 7 | 3 | — | — | ao sair da função, a e b somem; x e y seguem 7 e 3 |
| Durante alteraReferencia | 12 | 6 | 12 | 6 | a referencia x e b referencia y; mudanças refletem em x e y |
| Após alteraReferencia | 12 | 6 | — | — | ao sair, x e y permanecem alterados |
Conclusão final: , . 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.