Em nosso exemplo, as primeiras duas linhas da definição da função consistem no cabeçalho. Seu propósito é estabelecer o nome da função e dizer como esta deve ser chamada:
O cabeçalho acima diz que a função retorna um inteiro (tipo int
), que seu nome é fib
e que ela recebe um argumento chamado n
que também é um inteiro. (Tipos de dados serão explicados mais tarde, em .)
Para introduzir os conceitos mais básicos de C, vamos ver um código que implementa uma função matemática simples que faz cálculos com números inteiros. Esta função calcula o enésimo número na série de Fibonnaci, na qual cada número é a soma dos dois números anteriores: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ….
Este simples programa ilustra vários recursos da linguagem C:
A definição de uma função cujas primeiras duas linhas constituem no cabeçalho da função. Veja Definição de Funções.
Um parâmetro de função n
, referenciado com a variável n
dentro do corpo da função. Veja Variáveis de Parâmetros de Função. Uma definição de função usa parâmetros para se referir aos valores dos argumentos passados para ela numa chamada de função.
Aritmética. Programas em C somam com +
e subtraem com -
. Veja .
Comparações numéricas. O operador <=
testa se é "menor ou igual". Veja .
Constantes inteiras escritas na base 10. Veja Constantes Inteiras.
Uma chamada de função. A chamada de função fib (n - 1)
chama a função fib
passando o valor n - 1
como seu argumento. Veja Chamadas de Função.
Um comentário que começa com /*
e termina com */
. O comentário não tem nenhum efeito na execução do programa. Seu propósito é prover explicações para pessoas lendo o código-fonte. Incluir comentários no código é tremendamente importante - eles adicionam contexto de forma que outras pessoas possam entender o código mais rapidamente. Veja .
Dois tipos de comandos, o return
e o if...else
. Veja Comandos.
Recursão. A função fib
chama a si mesma; isto é chamado de chamada recursiva. Isto é válido em C e bastante comum.
A função fib
não seria útil se ela não retornasse. Portanto, funções recursivas, para serem úteis, precisam evitar recursão infinita.
Esta definição de função previne a recursão infinita ao tratar o caso especial onde n
é dois ou menos. Portanto a máxima profundeza de chamadas recursivas é menor que n
.
Cabeçalho da Função O nome da função e como ela é chamada.
Corpo da Função Declarações que implementam a função.
O resto da definição da função é chamado de corpo da função. Como qualquer corpo de função, este inicia com um {
, termina com um }
e contém zero ou mais comandos e declarações. Comandos especificam ações que o programa deve tomar. Declarações definem nomes de variáveis, funções, etc. Cada comando e cada declaração termina com um ponto-e-vírgula (;
).
Comandos e declarações frequentemente contém expressões; uma expressão é uma construção cuja execução produz um valor de algum tipo, mas também pode causar ações por meio de "efeitos colaterais" que alteram a execução subsequente. Diferentemente, um comando, não tem um valor; ele afeta a execução do programa somente através das ações que ele gera.
O corpo desta função fib
não contém declarações e contém somente um comando, mas este é um comando complexo uma vez que ele contém comandos aninhados. Essa função utiliza dois tipos de comandos:
return
O comando return
faz a função retornar imediatamente. Ele normalmente aparece assim:
Seu objetivo é computar o valor da expressão e sair da função, fazendo-a retornar o valor da expressão produzida. Por exemplo:
faz a função retornar o inteiro 1 e
faz a função retornar um valor computado ao fazer a soma dos resultados e duas chamadas de função, como especificado.
if…else
O comando if
…else
é um condicional. Sempre que ele executa, ele escolhe um dos seus dois sub-comandos para executar e ignora o outro. Veja:
primeiro testa se o valor de n
é menor ou igual a 2. Se sim, a expressão n <= 2
tem valor 1. Daí a execução continua com o comando
Do contrário, a execução continua com o comando:
Cada um desses comandos encerra a execução da função e provê um valor para que ela retorne. Veja Comando return.
Calcular fib(n)
, que utiliza inteiros, funciona apenas quando n < 47
porque o resultado de fib (47)
é muito grande para caber num tipo int
. A operação de adição ao tentar somar fib (46)
e fib (45)
não consegue produzir o resultado correto. Isto é chamado de estouro de inteiro (integer overflow).
O que ele faz é computar a expressão condicional e, se der "verdadeiro", ele executa o comando-se-verdadeiro. Do contrário, executa o comando-se-falso. Veja .
Dentro do comando if
…else
, condicional é simplesmente uma expressão. Ela é considerada "verdadeira" se seu valor for diferente de zero. (Uma operação de comparação como em n <= 2
, produz o valor 1 se for "verdadeiro" e 0 se for "falso.” Veja .) Portanto,
Estouros podem se manifestar de várias maneiras, mas uma coisa que eles não fazem é produzir o resultado correto já que este não cabe no espaço reservado para o valor. Veja .
Veja para uma explicação completa sobre funções.