Funções
O que são funções?
Em C uma função é um bloco de código que pode ser executado sempre que
necessário. O ponto de entrada main
, visto
anteriormente, é uma função. Um grande
motivo para utilizar funções é que basta utilizar seus nomes para executá-las.
Não é necessário reescrever o código, e isso facilita o desenvolvimento até de
pequenos programas.
Entrada e saída
Uma função pode ter entrada (recebe dados) e/ou saída (retorna dados). Para exemplificarmos as possibilidades, imaginemos algumas funções simples:
- foo, que recebe um número n e retorna seu dobro;
- bar, que não recebe nada e sempre retorna o número 3;
- baz, que recebe um número n e não retorna nenhum valor.
flowchart LR f1i[/n/]-->|Entrada|f1[[foo]] f1-->|Saída|f1o[/"2×n"/] f2[[bar]]--->|Saída|f2o[/3/] f3i[/n/]--->|Entrada|f3[[baz]]
Mesmo que uma função não produza saída, ela pode alterar o estado do programa, causando efeitos colaterais. Por isso, até funções sem saída podem ser úteis.
Definição
Para utilizar uma função em C, é necessário declará-la e defini-la—não faz sentido utilizar uma função se o compilador não a conhece.
A definição de uma função utiliza a seguinte sintaxe:
Tipo de sua saída (dado que a função retorna).
Nome da função.
Tipos e nomes de seus parâmetros (entradas—dados que a função recebe).
Corpo (código) que deve ser executado pela função.
Agora definiremos as funções descritas acima.
-
foo
- <saída>:
int
O tipoint
representa um número inteiro. - <nome>:
foo
- <params>:
int n
A entradan
deve ser um valor inteiro. - <corpo>:
{ return n * 2; }
O corpo da função deve estar entre chaves. Apenas precisamos calcular o dobro den
(n * 2
, pois*
é o operador de multiplicação em C) e retorná-lo com a palavra-chavereturn
.return
também finaliza a execução da função.
int foo(int n) { return n * 2; }
- <saída>:
-
bar
- <saída>:
int
- <nome>:
bar
- <params>:
void
O tipovoid
representa a ausência de um valor. - <corpo>:
{ return 3; }
int bar(void) { return 3; }
- <saída>:
-
baz
- <saída>:
void
- <nome>:
baz
- <params>:
int n
- <corpo>:
{}
Um corpo vazio, que não executa nada.
void baz(int n) {}
- <saída>:
Uso
Para utilizar as funções foo
, bar
e baz
definidas acima, utilizamos a
sintaxe
Expressão7 que denota uma função, e.g. o nome de uma função.
Lista com zero ou mais argumentos (expressões) separados por
vírgula, e.g. 5, pi + 3, 'z', 49
.
Um trecho de código que calcula um valor, ou se refere a um
objeto/função, ou gera efeitos colaterais no programa, ou realiza qualquer
combinação desses comportamentos. Uma expressão que produz um valor pode ser
utilizada em alguns contextos em que se espera um valor, e.g. a expressão
bar()
pode ser usada como um valor do tipo int
.
Dizemos que uma função é "chamada" quando é utilizada dessa forma. Uma chamada
de função é uma expressão que possui o valor retornado pela função no final de
sua execução; isso significa que a expressão bar()
(chamada da função bar
) é
aproximadamente equivalente à expressão 3
.
A função bar2
abaixo retornará o valor 6
(3 + 3
):
int bar2(void) { return bar() + bar(); }
Como chamadas de função são expressões, podemos utilizá-las como argumentos para
funções. foo(bar())
resulta em foo(3)
, que resulta em 6
.
Funções na biblioteca padrão
Antes de criar uma função, verifique se uma equivalente já não existe na
biblioteca padrão do C. Para calcular o logaritmo natural de um número, por
exemplo, basta utilizar a função log
do arquivo <math.h>
.
Um programa que calcula o logaritmo natural de 5 pode ser feito assim:
#include <math.h>
int main(void)
{
log(5);
return 0;
}
Embora <math.h>
seja parte da biblioteca padrão, seu código pode não ser
ligado automaticamente ao programa. Para solicitar a ligação no compilador GCC,
adicione o argumento -lm
na compilação (e.g. gcc main.c -lm
). Em outros
compiladores o procedimento pode ser diferente.
Lembre-se também que no exemplo acima, o valor de log(5)
não é utilizado ou
exibido—a exibição de valores numéricos será introduzida posteriormente.