Em C não existe uma distinção entre funções e subrotinas. Ou seja, todas as subrotinas, do ponto de vista de algoritmos, podem ser tratadas como funções que não retornam nenhum valor.
Formato de declaração de funções :
Tipo de retorno identificador_da_função (tipo1 param1, tipo2 param2,..., tipoN paramN)
{//corpo da função
return valor de retorno;} //fim da função
Tipo de retorno especifica o tipo do valor que será retornado para quem chamou a função. Quando o tipo de retorno for void isto significa que se trata de uma função que se comporta como uma subrotina; ou seja, a função não necessita retornar nenhum valor, apenas ser chamada.
Exemplos de tipos de retorno nos cabeçalhos das funções:
int func1(...) //retorna um valor inteiro
void func2(...) //não retorna nenhum valor. Comporta-se como subrotina
O comando return é utilizado para realizar o retorno da função; este pode ser utilizado em qualquer ponto da função que se deseje finalizar a sua execução e retornar o valor (se a função retornar algum valor) para quem a chamou. Valor de retorno é o valor a ser efetivamente retornado e pode ser tanto uma variável como uma constante; nos casos em que a função não retorna nenhum valor o comando return deve ser utilizado sozinho ou pode-se simplesmente omití-lo, o que fará com que a função retorne automaticamente ao seu final.
Exemplos de uso de return:
return 0; //retorna o valor constante 0
return var; //retorna o valor da variável var
return; //não retorna valor. É usado para funções com retorno do tipo void
Os parâmetros param1 a paramN identificam os parâmetros que se deseja passar para a função. Cada um destes parâmetros passa a ser uma variável local da função de tipo tipo1 a tipoN e é inicializado com o valor que foi passado para si no momento da chamada da função. Funções que não recebem nenhum valor como parâmetro devem ser declaradas com a palavra void entre os parênteses.
Exemplos de declarações de parâmetros no cabeçalho das funções:
... Func1(int var, char var2) //dois parâmetros, um int e um char
{}
... Func2 (void) //não recebe nenhum parâmetro
{}
Exemplo de função
e programa em C que a chama:
int func1 (char carac, int inteiro, float flutuante) //declaracão da função
{int outra; //pode-se declarar outras variáveis aqui dentro, como em um trecho
//normal de programa
//estas variáveis são locais da funçãoprintf(%c, carac); //uso das variáveis recebidas como parâmetro
printf(%f, flutuante);
scanf(%d, &outra);
printf(%d, inteiro + outra);return outra; //retorna o valor da variável outra
} //fim da função
void main (void) //programa principal
{char c1;
float f;
int resultado;
int inteiro;
//esta variável inteiro existe no escopo da função
//main, logo não tem nada a ver
//com a variável inteiro que é criada na função
//func1 no momento da passagem
//dos parâmetrosscanf(%d, %c, %f, &inteiro, &c1, &f); //lê um número
// inteiro, um caracter e um floatresultado = func1(c1, inteiro, f); //chama a função func1 com os
//parâmetros na ordem corretaprintf(%d, resultado); //imprime resultado da função
}
Observações:
- main () também é uma função, porém especial já que ela representa o ponto de partida para qualquer programa em C;
- O resultado da função func1, no exemplo acima, não precisa necessariamente ser atribuído a uma variável (no caso, resultado); se isto não acontecer o valor de retorno da função simplesmente será perdido. Porém, como a função foi feita para retornar um valor inteiro isto deve ser evitado, porque constitui-se em uma má estruturação e uso da função;
- Todas as variáveis declaradas dentro do corpo de uma função são locais a ela, ou seja, só existem enquanto a função está sendo executada.
- Todas as funções devem ser conhecidas no local onde forem utilizadas, ou seja, a sua declaração deve vir antes do uso. Caso não se deseje implementar a função antes do local onde ela vai ser utilizada pode-se escrever um protótipo da seguinte forma:
Tipo de retorno identificador_da_função (tipo1 param1, tipo2 param2,..., tipoN paramN);
O protótipo deve ser colocado antes da chamada da função, sinalizando então ao compilador que aquela função existe e vai ser implementada adiante. No nosso exemplo, se quiséssemos escrever a função func1 depois da função main deveríamos incluir um protótipo de func1 antes dela.
CUIDADO!! O protótipo não é exatamente igual ao cabeçalho da função, ele possui um ponto-e-vírgula a mais no final!
Variáveis globais:
Em C considera-se como variável global todas aquelas variáveis declaradas fora do escopo de qualquer função (inclusive da função main). Qualquer variável só é conhecida após a sua declaração, logo costuma-se declarar todas as variáveis globais no início do programa, antes da implementação das funções que a utilizam.
Exemplo de declaração e uso de variáveis globais:
int c;
char t;int func1 (void) //função que retorna um valor inteiro e não recebe
// parâmetro
{int t; //existe uma variável t que é global, porém esta
//funciona como uma variável localif (c!=0) //c é global, logo pode ser utilizada dentro da função
//func1
{c++;
t = c*2;
return t; //neste caso o valor de t retornado é o da
//variável local, já que definições locais
//sobrepõem-se a definições globais nos escopos onde existem}
else return 0;}
void main(void)
{int retorno;
printf(Entre com um caracter:);
scanf(%c, &t);
printf(Entre com um inteiro:);
scanf(%d, &c); //as variáveis t e c podem ser usadas aqui
//porque são globaisretorno = func1(); //chama a função func1 e retorna o valor na
//variável retornoprintf(\nResultado: %d, retorno);
}