Quiz (Funções)

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

int add(int a, int b) {
    return a + b;
}
int main(void) {
    printf("%d\n", add(3, 7));
    return 0;
}

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

void change(int x) {
    x = 100;
}
int main(void) {
    int a = 5;
    change(a);
    printf("a = %d\n", a);
    return 0;
}

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

void greet(void) {
    printf("Hello!\n");
    return 1;
}

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.

Questão 4 — Ordem de declaração e chamada

#include <stdio.h>

int main(void) {
    printf("%d\n", square(5));
    return 0;
}

int square(int n) {
    return n * n;
}

O que acontece?

25
Erro de compilação (declaração implícita)
0
5
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

void foo(void) {
    int x = 10;
}
int main(void) {
    foo();
    printf("%d\n", x);
    return 0;
}

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.

Questão 6 — Chamadas de função recursivas

int fact(int n) {
    if (n <= 1) return 1;
    return n * fact(n - 1);
}
int main(void) {
    printf("%d\n", fact(4));
    return 0;
}

O que isso imprime?

16
24
4
Laço infinito
Explicação: Uma função recursiva clássica que calcula fatorial.
  • fact(4) = 4 * fact(3)
  • fact(3) = 3 * fact(2)
  • fact(2) = 2 * fact(1)
  • fact(1) = 1 (caso base)
  • Resultado: 4 * 3 * 2 * 1 = 24
Toda recursão precisa de um caso base. Sem ele, ela roda para sempre e acaba estourando a pilha.

Questão 7 — Múltiplos argumentos e ordem

int sub(int a, int b) {
    return a - b;
}
int main(void) {
    printf("%d\n", sub(3, 10));
    return 0;
}

O que isso imprime?

7
-7
13
Erro de compilação
Explicação: Os argumentos são vinculados na ordem em que foram declarados.
  • Chamada: sub(3, 10)
  • Dentro da função: a=3, b=10
  • a - b = 3 - 10 = -7
Misturar a ordem dos argumentos é uma fonte comum de bugs. Escolha uma ordem que case com o que a função deve fazer.

Questão 8 — Retorno antecipado

int check(int n) {
    if (n < 0) return -1;
    if (n == 0) return 0;
    return 1;
}
int main(void) {
    printf("%d\n", check(-5));
    return 0;
}

O que isso imprime?

0
-1
1
-5
Explicação: Quando um comando return é executado, a função sai imediatamente.
  • n = -5, então n < 0 é verdadeiro
  • return -1; é executado
  • Tudo depois disso é pulado
"Retorno antecipado" é popular para proteger contra erros e casos limite — mantém o aninhamento raso.

Questão 9 — Conversão de tipo de argumento

int twice(int x) {
    return x * 2;
}
int main(void) {
    double d = 3.7;
    printf("%d\n", twice(d));
    return 0;
}

O que isso imprime?

7.4
6
Erro de compilação
8
Explicação: O tipo do parâmetro é int, então o argumento double é implicitamente convertido para int (truncado).
  • d = 3.7 → convertido para int → 3 (a parte fracionária é descartada, não arredondada)
  • twice(3) = 3 * 2 = 6
O compilador pode avisar sobre a conversão implícita. Se for intencional, torne-a explícita com um cast como (int)d.

Resultado

Responda todas as questões para ver sua pontuação.
Início