Dominando Funções em C: Exemplos Práticos de Recursão e Técnicas Inline
O Que É uma Função em C?
Função em programação C é um bloco de código reutilizável que torna um programa mais fácil de entender, testar e pode ser facilmente modificado sem alterar o programa chamador. Funções dividem o código e modularizam o programa para resultados melhores e mais eficazes. Em resumo, um programa maior é dividido em vários subprogramas chamados de funções.

Quando você divide um programa grande em várias funções, fica fácil gerenciar cada função individualmente. Sempre que um erro ocorre no programa, você pode investigar facilmente funções defeituosas e corrigir apenas aqueles erros. Você pode facilmente chamar e usar funções quando necessário, o que automaticamente leva a economia de tempo e espaço.
Neste tutorial, você aprenderá:
- Funções de Biblioteca vs. Funções Definidas pelo Usuário
- Declaração de Função
- Definição de Função
- Chamada de Função
- Argumentos de Função
- Escopo de Variáveis
- Variáveis Estáticas
- Funções Recursivas
- Funções Inline
Funções de Biblioteca vs. Funções Definidas pelo Usuário
Todo programa 'C' tem pelo menos uma função que é a função main, mas um programa pode ter qualquer número de funções. A função main() em C é o ponto de partida de um programa.
Na programação 'C', funções são divididas em dois tipos:
- Funções de biblioteca
- Funções definidas pelo usuário
A diferença entre funções de biblioteca e definidas pelo usuário em C é que não precisamos escrever código para uma função de biblioteca. Ela já está presente no arquivo de header que sempre incluímos no início de um programa. Você só precisa digitar o nome da função e usá-la com a sintaxe adequada. Printf, scanf são exemplos de função de biblioteca.
Já uma função definida pelo usuário é um tipo de função em que temos que escrever o corpo da função e chamá-la sempre que precisarmos que a função realize alguma operação em nosso programa.
Uma função definida pelo usuário em C é sempre escrita pelo usuário, mas depois pode se tornar parte da biblioteca 'C'. É uma grande vantagem da programação 'C'.
Funções de programação C são divididas em três atividades:
- Declaração de função
- Definição de função
- Chamada de função
Declaração de Função
Declaração de função significa escrever o nome de um programa. É uma parte obrigatória para usar funções no código. Em uma declaração de função, apenas especificamos o nome de uma função que vamos usar em nosso programa, como uma declaração de variável. Não podemos usar uma função a menos que ela seja declarada em um programa. Uma declaração de função também é chamada de "Function prototype."
As declarações de função (chamadas prototype) são geralmente feitas acima da função main() e tomam a forma geral:
tipo_retorno nome_funcao (tipo_dado argumentos);
- O tipo_retorno: é o tipo de dado do valor que a função retorna à declaração chamadora.
- O nome_funcao: é seguido por parênteses
- Argumentos nomes com suas declarações de tipo de dados opcionalmente são colocados dentro dos parênteses.
Considere o seguinte programa que mostra como declarar uma função cubo para calcular o valor do cubo de uma variável inteira:
#include <stdio.h>
/*Declaração de função*/
int add(int a,b);
/*Fim da declaração de função*/
int main() {
Lembre-se que uma função não necessariamente retorna um valor. Neste caso, a palavra-chave void é usada.
Por exemplo, a declaração da função output_message indica que a função não retorna valor: void output_message();
Definição de Função
Definição de função significa apenas escrever o corpo de uma função. Um corpo de função consiste em declarações que vão realizar uma tarefa específica. Um corpo de função consiste em uma única declaração ou um bloco de declarações. Também é uma parte obrigatória de uma função.
int add(int a,int b) //corpo da função
{
int c;
c=a+b;
return c;
}
Chamada de Função
Chamada de função significa chamar uma função sempre que necessário em um programa. Sempre que chamamos uma função, ela realiza uma operação para a qual foi projetada. Uma chamada de função é uma parte opcional de um programa.
resultado = add(4,5);
Aqui está o código completo:
#include <stdio.h>
int add(int a, int b); //declaração de função
int main() {
int a=10,b=20;
int c=add(10,20); //chamada de função
printf("Addition:%d\n",c);
getch();
}
int add(int a,int b) //corpo da função
{
int c;
c=a+b;
return c;
}
Saída:
Addition:30
Argumentos de Função
Argumentos de uma função são usados para receber os valores necessários pela chamada da função. Eles são correspondidos por posição; o primeiro argumento é passado para o primeiro parâmetro, o segundo para o segundo parâmetro e assim por diante.
Por padrão, os argumentos são passados por valor, no qual uma cópia dos dados é dada à função chamada. A variável realmente passada não mudará.
Considere o seguinte programa que demonstra parâmetros passados por valor:
int add (int x, int y);
int main() {
int a, b, result;
a = 5;
b = 10;
result = add(a, b);
printf("%d + %d = %d\n", a, b, result);
return 0;
}
int add (int x, int y) {
x += y;
return(x);
}
A saída do programa é:
5 + 10 = 15
Lembre-se que os valores de a e b passados para a função add não foram alterados porque apenas seu valor foi passado para o parâmetro x.
Escopo de Variáveis
Escopo de variável significa a visibilidade de variáveis dentro do código do programa.
Em C, variáveis declaradas dentro de uma função são locais àquele bloco de código e não podem ser referenciadas fora da função. No entanto, variáveis declaradas fora de todas as funções são globais e acessíveis de todo o programa. Constantes declaradas com #define no topo de um programa são acessíveis de todo o programa. Considere o seguinte programa que imprime o valor da variável global tanto do main quanto da função definida pelo usuário:
#include <stdio.h>
int global = 1348;
void test();
int main() {
printf("from the main function : global =%d \n", global);
test() ;
return 0;
}
void test (){
printf("from user defined function : global =%d \n", global);
}
Resultado:
from the main function : global =1348 from user defined function : global =1348
Discutimos os detalhes do programa:

- Declaramos uma variável global inteira com 1348 como valor inicial.
- Declaramos e definimos uma função test() que não recebe argumentos nem retorna valor. Esta função apenas imprime o valor da variável global para demonstrar que variáveis globais podem ser acessadas em qualquer lugar do programa.
- Imprimimos a variável global dentro da função main.
- Chamamos a função test para imprimir o valor da variável global.
Em C, quando argumentos são passados para parâmetros de função, os parâmetros atuam como variáveis locais que serão destruídas ao sair da função.
Quando você usa variáveis globais, use-as com cautela porque podem levar a erros e podem mudar em qualquer lugar do programa. Devem ser inicializadas antes de usar.
Variáveis Estáticas
Variáveis estáticas têm escopo local. No entanto, não são destruídas ao sair da função. Portanto, uma variável estática retém seu valor para sempre e pode ser acessada quando a função é reentrada. Uma variável estática é inicializada quando declarada e precisa do prefixo static.
O seguinte programa usa uma variável estática:
#include <stdio.h>
void say_hi();
int main() {
int i;
for (i = 0; i < 5; i++) {
say_hi();
}
return 0;
}
void say_hi() {
static int calls_number = 1;
printf("Hi number %d\n", calls_number);
calls_number ++;
}
O programa exibe:
Hi number 1 Hi number 2 Hi number 3 Hi number 4 Hi number 5
Funções Recursivas
Considere o fatorial de um número que é calculado como segue 6! = 6 * 5 * 4 * 3 * 2 * 1.
Este cálculo é feito como cálculo repetido de fact * (fact -1) até fact ser igual a 1.
Uma função recursiva é uma função que chama a si mesma e inclui uma condição de saída para terminar as chamadas recursivas. No caso do cálculo do número fatorial, a condição de saída é fact igual a 1. A recursão funciona "empilhando" chamadas até a condição de saída ser verdadeira.
Por exemplo:
#include <stdio.h>
int factorial(int number);
int main() {
int x = 6;
printf("The factorial of %d is %d\n", x, factorial(x));
return 0;
}
int factorial(int number) {
if (number == 1) return (1); /* condição de saída */
else return (number * factorial(number - 1));
}
O programa exibe:
The factorial of 6 is 720
Aqui, discutimos detalhes do programa:

- Declaramos nossa função fatorial recursiva que recebe um parâmetro inteiro e retorna o fatorial deste parâmetro. Esta função chamará a si mesma e diminuirá o número até a condição de saída, ou condição base, ser alcançada. Quando a condição é verdadeira, os valores gerados anteriormente serão multiplicados entre si, e o valor final do fatorial é retornado.
- Declaramos e inicializamos uma variável inteira com valor "6" e então imprimimos seu valor fatorial chamando nossa função fatorial.
Considere o seguinte gráfico para entender melhor o mecanismo recursivo que consiste em chamar a função a si mesma até o caso base ou condição de parada ser alcançado, e depois disso, coletamos os valores anteriores:

Funções Inline
Função em programação C é usada para armazenar as instruções mais frequentemente usadas. É usada para modularizar o programa.
Sempre que uma função é chamada, o ponteiro de instrução salta para a definição da função. Após executar uma função, o ponteiro de instrução volta para a declaração de onde saltou para a definição da função.
Sempre que usamos funções, precisamos de um cabeçalho extra de ponteiro para saltar para a definição da função e retornar à declaração. Para eliminar a necessidade de tais cabeçalhos de ponteiro, usamos funções inline.
Em uma função inline, uma chamada de função é diretamente substituída pelo código real do programa. Ela não salta para nenhum bloco porque todas as operações são realizadas dentro da função inline.
Funções inline são usadas principalmente para pequenos cálculos. Não são adequadas quando grande computação está envolvida.
Uma função inline é similar à função normal exceto que a palavra-chave inline é colocada antes do nome da função. Funções inline são criadas com a seguinte sintaxe:
inline nome_funcao () { //definição da função }
Vamos escrever um programa para implementar uma função inline.
inline int add(int a, int b) //declaração de função inline
{
return(a+b);
}
int main() {
int c=add(10,20);
printf("Addition:%d\n",c);
getch();
}
Saída:
Addition: 30
O programa acima demonstra o uso de uma função inline para adição de dois números. Como podemos ver, retornamos a adição de dois números dentro da função inline apenas sem escrever linhas extras. Durante a chamada da função, apenas passamos valores nos quais temos que realizar adição.
Resumo
- Uma função é um mini-programa ou subprograma.
- Funções são usadas para modularizar o programa.
- Biblioteca e usuário-definida são dois tipos de funções.
- Uma função consiste em declaração, corpo da função e parte de chamada da função.
- Declaração de função e corpo são obrigatórios.
- Chamada de função pode ser opcional em um programa.
- Programa C tem pelo menos uma função; é a função main().
- Cada função tem um nome, tipo de dado do valor de retorno ou void, parâmetros.
- Cada função deve ser definida e declarada no seu programa C.
- Lembre-se que variáveis ordinárias em uma função C são destruídas assim que saímos da chamada da função.
- Argumentos passados para uma função não serão alterados porque passados por valor, não por endereço.
- O escopo da variável refere-se à visibilidade de variáveis dentro de um programa.
- Existem variáveis globais e locais na programação C.
Linguagem C
- Como Passar Arrays para Funções em C++: Guia Prático
- Quatro Padrões Comprovados para Funções Definidas pelo Usuário em C
- Laço do-while em C++: Sintaxe, Exemplos Práticos e Loops Aninhados
- Sobrecarga de Operadores em C++: Guia Prático com Exemplos de Código
- Funções em C++ Explicadas com Exemplos Práticos de Código
- calloc() em C: Alocação de Memória Inicializada com Zero e Exemplo Prático
- Dominando Funções Lambda em Python: Exemplos Práticos e Boas Práticas
- Função round() em Python Explicada com Exemplos Práticos
- Dominando a Função map() do Python: Sintaxe, Exemplos e Boas Práticas
- Dominando Funções em Verilog para Design RTL Eficiente