Revise as aulas 24 a 33 com uma folha de consulta, seis questões de leitura de código e uma lista de erros frequentes.
// Tipo de retorno nome(tipo do parâmetro, ...) int square(int x) { return x * x; } int main(void) { printf("%d\n", square(5)); // 25 }
voidreturn devolve um valor (e encerra a função)void add10(int x) { x += 10; // x é uma cópia } int main(void) { int a = 5; add10(a); printf("%d\n", a); // Continua 5! }
int g = 100; // Global void f(void) { int x = 1; // Local apenas de f } int main(void) { int x = 2; // x de main (outra variável) f(); printf("%d %d\n", x, g); // 2 100 }
void fill(int a[], int n) { for (int i = 0; i < n; i++) a[i] = 7; } int main(void) { int a[3] = {0}; fill(a, 3); // a passa a ser {7, 7, 7} }
sizeof não fornece o comprimento (passe-o separadamente)int factorial(int n) { if (n <= 1) return 1; // Caso base! return n * factorial(n - 1); } // factorial(4) = 4*3*2*1 = 24
// Declare antes (a implementação pode vir depois) int add(int, int); int main(void) { printf("%d\n", add(2, 3)); } int add(int a, int b) { return a + b; }
int square(int x) { return x * x; } int main(void) { printf("%d\n", square(3) + square(4)); }
square(3) vale 9 e square(4) vale 16. Portanto, 9 + 16 = 25, e a saída é 25. Essa soma também aparece na relação pitagórica 3–4–5.void add10(int x) { x += 10; } int main(void) { int a = 5; add10(a); printf("%d\n", a); }
void add10(int *p) ou atribua um valor retornado, como em a = add10(a).void setZero(int a[], int n) { for (int i = 0; i < n; i++) a[i] = 0; } int main(void) { int a[3] = {7, 8, 9}; setZero(a, 3); printf("%d %d %d\n", a[0], a[1], a[2]); }
a[i] = 0 modifica o array original, produzindo 0 0 0. Compare com a cópia do valor int na questão 2.int g = 100; void f(void) { int g = 1; // Local com o mesmo nome printf("f: %d\n", g); } int main(void) { f(); printf("main: %d\n", g); }
int g = 1; declara uma variável local, diferente da global g. A local oculta a global dentro da função (shadowing). Assim, f exibe f: 1, e main usa a global, exibindo main: 100.int fact(int n) { if (n <= 1) return 1; return n * fact(n - 1); } printf("%d\n", fact(4));
4! = 4 × 3 × 2 × 1 = 24. As chamadas se expandem em fact(4) = 4 * fact(3) = 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1). O caso base n <= 1 retorna 1 e encerra a recursão. A saída é 24.void show(int a[]) { printf("%zu\n", sizeof a); } int main(void) { int a[5] = {0}; show(a); }
sizeof a retorna o quê?int a[] é ajustado para um ponteiro. Dentro da função, sizeof mede esse ponteiro (8 bytes em muitos ambientes), não o array inteiro. Passe o comprimento como outro argumento, por exemplo void show(int a[], int n).return incompatíveisint como retorno converte implicitamente um double para int.void com return x; viola as regras do retorno.
sizeof dentro da função