(3.0 pontos) Simule a execução do programa abaixo, destacando o que vai ser impresso.
#include <stdio.h>
double fun1(int *x, int y);
void fun2(int *a, int *b);
int main()
{
    int x = 1, y = 0;
    double z = 5.0;
    fun2(&x, &y);
    printf("x = %d, y = %d, z = %.2f\n", x, y, z);
    x = 1;
    y = 4;
    z = 3 * fun1(&x, y + 1);
    printf("x = %d, y = %d, z = %.2f\n", x, y, z);
    x = 1;
    /* note que a função fun2 abaixo recebe &x e &x */
    fun2(&x, &x);
    printf("x = %d, y = %d, z = %.2f\n", x, y, z);
    return 0;
}
double fun1(int *x, int y) {
    int i;
    i = *x;
    *x = y;
    y = i;
    return (*x + y) / 2.0;
}
void fun2(int *a, int *b) {
    *b += 2;
    *a = *b + 1;
}
main fun1 fun2

Saída do programa

Passo 1

O enunciado apresenta um programa em C que explora passagem de parâmetro por referência (ponteiros) em fun2 e por referência/valor em fun1, usando as variáveis inteiras x e y e a variável real z. Nossa tarefa é simular cada chamada de função e registrar o que cada printf imprime.

Passo 2

No início de main temos \;x=1, \;y=0 e \;z=5{,}0.
Chama-se fun2(&x,&y). Em fun2(int *a, int *b):
  • *b += 2 incrementa y de 0 para 2.
  • *a = *b + 1 atribui a x o valor 2 + 1 = 3.
    Ao retornar, x=3, y=2 e z permanece 5{,}0.
    O primeiro printf imprime
    x =3, y =2, z =5.00

Passo 3

Em seguida, ajusta-se \;x=1, \;y=4 e faz-se \;z = 3 \times \text{fun1}(&x,\,y+1).
Na chamada fun1(int *x, int y), onde o segundo argumento é y+1=5:
  1. i = *x guarda 1 em i.
  2. *x = y altera x para 5.
  3. y = i atualiza a variável local y para 1.
  4. Retorna ( *x + y )/2.0 = (5 + 1)/2 = 3.0.
    De volta em main, x vale 5, o y externo continua 4 (porque o y da função era local) e \;z = 3 \times 3{,}0 = 9{,}0.
    O segundo printf imprime
    x =5, y =4, z =9.00

Passo 4

Por fim, faz-se \;x=1 e chama-se fun2(&x,&x), ou seja, ambos os parâmetros apontam para a mesma variável x. Dentro de fun2:
  • *b += 2 faz x = 1 + 2 = 3.
  • *a = *b + 1 faz x = 3 + 1 = 4.
    Ao retornar, x=4, enquanto y e z não mudam (ficam 4 e 9,0, respectivamente).
    O terceiro printf imprime
    x =4, y =4, z =9.00

Resposta

x =3, y =2, z =5.00
x =5, y =4, z =9.00
x =4, y =4, z =9.00

Exercícios relacionados