Teste seu entendimento sobre valores de retorno, passagem por valor, funções void e declarações de protótipo.
Questão 1 — Valor de retorno
intadd(int a, int b) {
return a + b;
}
intmain(void) {
printf("%d\n", add(3, 7));
return0;
}
O que isso imprime?
7
10
3
Erro de compilação
Explicação:add(3, 7) recebe a=3 e b=7, e retorna 3 + 7 = 10.
Questão 2 — Passagem por valor
voidchange(int x) {
x = 100;
}
intmain(void) {
int a = 5;
change(a);
printf("a = %d\n", a);
return0;
}
O que isso imprime?
a = 100
a = 5
a = 0
Erro de compilação
Explicação: C usa passagem por valor. Dentro de change, x é uma cópia de a. Modificar x não afeta o a original, então ele permanece 5.
Questão 3 — função void
voidgreet(void) {
printf("Hello!\n");
return1;
}
O que acontece?
Compila normalmente
Erro (ou aviso) de compilação
Erro em tempo de execução
Imprime "Hello!" e 1
Explicação: Uma função void não pode retornar um valor, então return 1; é um erro de compilação. Dentro de uma função void você só pode usar return; sem valor.
Explicação:square está definida depois de main. Sem uma declaração de protótipo, o compilador ainda não conhece square quando ela é chamada, o que produz um aviso ou erro de declaração implícita. Correção: adicione int square(int n); antes de main, ou mova a definição da função para antes de main.
Questão 5 — Escopo de variáveis locais
voidfoo(void) {
int x = 10;
}
intmain(void) {
foo();
printf("%d\n", x);
return0;
}
O que acontece?
Imprime 10
Erro de compilação (x fora de escopo)
Imprime 0
Erro em tempo de execução
Explicação: O escopo de uma variável local está limitado ao bloco em que foi declarada.
x, declarada dentro de foo, só é válida dentro de foo
Quando foo retorna, x deixa de existir
Como x não é visível a partir de main, o compilador reporta erro de "não declarado"
Para compartilhar valores entre funções, use parâmetros, valores de retorno ou variáveis globais.