Stoa :: C/C++ :: Blog :: Introdução à programação em C – parte 4

novembro 21, 2007

user icon

Retomemos o exemplo da parte 1 desta introdução:

 

1: #include<stdio.h>

2:

3: int main() {

4:     printf("\nOla, mundo da programacao!!!\n");

5:     return 0; }

6:

 

 

Na parte 2 da introdução vimos que a primeira linha deste código fonte refere-se à inserção, nesse ponto do programa, de um outro arquivo, o “stdio.h”. Vimos também que essa inserção corresponde à funcionalidade de uma biblioteca de funções. Caso você queira informações sobre esse tópico, leia a parte 2 desta introdução.

 

 

Na parte 3 da introdução explicamos qual a importância do estilo de programação e como documentar seu código fonte. Para maiores detalhes sobre esses temas, consulte a parte 3 da introdução.

 

 

Nesta parte da introdução, falaremos mais uma vez sobre reuso de código, mas desta vez falaremos da estrutura mais essencial da linguagem C, as funções.

 

 

Uma função tem o mesmo objetivo que uma biblioteca: ela é usada para evitar que um código que deve ser utilizado várias vezes tenha que ser escrito várias vezes. Em outras palavras, as funções permitem o reuso do código.

 

 

Uma função pode ser entendida como uma "caixa preta" que recebe algo, processa esse algo recebido, e então nos devolve alguma outra coisa. Podemos encarar muitas coisas como uma caixa preta. Por exemplo, se um garçom for uma caixa preta, nós enviamos para ele algum dinheiro e uma ordem, por exemplo, "Um guaraná" ele nos retorna uma lata de refrigerante. O que ocorre aqui é que o garçom faz algo de útil para nós, mas que poderíamos ter feito nós mesmos.

 

 

Vamos imaginar que um jornal seja uma caixa preta, uma função. Um jornal recebe nosso dinheiro e nos retorna informação. Poderíamos nós mesmos investigar cada coisa? Em teoria, sim, mas na prática não. O mesmo ocorre na programação: aquilo que está numa função poderia ser reescrito tantas vezes quanto for necessário, mas na prática isso se torna impraticável.

 

 

De modo que as funções têm como objetivo realizar um conjunto de operações cujo resultado seja útil para nós. No caso do C/C++, as funções fazem isso utilizando como material de construção as operações básicas da linguagem e outras funções.

 

 

No nosso exemplo, temos duas funções: a função main e a função printf. A função printf é uma função de biblioteca, ela está contida na biblioteca stdio. É para poder utilizar essa biblioteca que nós incluímos essa biblioteca na primeira linha do exemplo. No nosso exemplo, a função printf é chamada. Já a função main é definida. Existe uma terceira maneira de uma função "aparecer" no nosso código fonte que é quando uma função é declarada. Vejamos cada uma dessas maneira em que as funções podem aparecer.

 

 

O objetivo de criar funções é usa-las depois. Se não fosse assim, seria como se quisessemos escrever receitas que nunca iríamos cozinhar. Portanto, a maneira mais importante em que uma função pode aparecer no código fonte é quando ela é usada, ou seja, é quando a função é chamada.

 

 

No caso de nosso exemplo, a função printf é chamada. Leia abaixo uma cópia da linha relevante do exemplo:

 

 

4:     printf("\nOla, mundo da programacao!!!\n");

 

 

Em primeiro lugar, uma chamada a função é uma instrução como outra qualquer, e portanto ela é terminada com um ponto-e-vírgula. Em segundo lugar, note que esta chamada a função é, metaforicamente, como uma frase no imperativo: printf, faça tal coisa! Não há diálogo, isto é, não se espera que printf nos fale algo de útil, que é o mesmo que dizer que printf não tem valor de retorno*. Veremos daqui a pouco um exemplo de uma função que tem valor de retorno.

 

 

Outra coisa importantíssima a se observar na chamada a printf é que nós a chamamos com um certo parâmetro - que em programês é chamado de argumento. No nosso exemplo, o argumento é "\nOla, mundo da programacao!!!\n". Esse argumento é portanto uma frase**. Qualquer variável de C/C++ pode ser um argumento - um caractere, um número, etc., e não apenas frases.

 

 

O que acontece quando o computador encontra uma chamada a função? O controle é passado para a função, isto é, quando o computador encontra uma chamada a função, ele passa a executar as instruções encontradas na definição da função, atribuindo a cada um dos argumentos da função o valor correspondente na chamada à função. Quando o controle chega no final da função, ele é retornado para o ponto imediatamente posterior à chamada da função.

 

 

No nosso exemplo, também aparece a função main. No caso, o que aparece é a  definição dessa função. Uma definição é composta pelo cabeçalho, que identifica o tipo de retorno, o nome da função e seus argumentos. No nosso exemplo:

 

 

3: int main() {

 

 

Portanto o tipo de retorno é int (ou seja, uma variável número do tipo inteiro), o nome da função é main e os argumentos são o conjunto vazio, isto é, a função não recebe argumentos.

 

 

Tudo o que está dentro do abre e fecha chaves imediatamente posteior ao cabeçalho corresponde ao corpo da função, ou seja, às instruções que serão executadas sempre que a função for chamada. No nosso caso, este é o corpo da função:

 

 

{

4:     printf("\nOla, mundo da programacao!!!\n");

5:     return 0; }

 

 

Portanto a função main executa duas instruções: a printf (que é uma chamada a função, o que demonstra uma das maneiras em que funções podem ser aninhadas) e a instrução return, que faz com que a função atualmente sendo executada seja terminada retornando o valor imediatamente posterior à palavra return. Portanto, a função main de nosso exemplo termina retornando o valor 0 (zero). É isto o que significa uma função ter um valor de retorno: quando ela é encerrada, ela retorna para o ponto em que foi chamada um valor indicado pela palavra-chave return.

 

 

Para finalizar, é importante mencionar que em C/C++ um programa compilado sempre "começa" sua execução com uma chamada a uma função chamada main. Isto significa que todo programa em C/C++ deve possuir uma função main, e essa função é executada toda vez que o programa é chamado pelo sistema operacional. É por isso que ao compilarmos e executarmos o exemplo, a primeira coisa que o computador fará será a primeira instrução da função main, e irá seguir essa função instrução por instrução até que a função main termine ou uma chamada à função exit() seja encontrada (a função exit termina um programa imediatamente).

 

 

* Isso na verdade é falso - printf tem valor de retorno mas geralmente esse valor é ignorado. Printf retorna 0 se não foi possível imprimir a string em stdout e 1 se foi possível.

 

 

** Um aviso aos incautos: frases em C/C++ são coisas bem complicadas. Estou simplificando aqui apenas para explicar sobre funções com o mínimo de complicações.

Postado por Renato Callado Borges em C/C++

Você deve entrar no sistema para escrever um comentário.

Termo de Responsabilidade

Todo o conteúdo desta página é de inteira responsabilidade do usuário. O Stoa, assim como a Universidade de São Paulo, não necessariamente corroboram as opiniões aqui contidas.