Função main() e estrutura básica de um programa em C

            Agora que já sabemos alguns conceitos básicos e temos um editor de texto e um compilador configurado, vamos entender a estrutura básica de um programa em linguagem C (você pode digitar o mesmo código abaixo no editor de texto de sua preferência):

1    int main(void) {
2
3          return 0;
4
5    }

            À primeira vista pode parecer não fazer sentido, mas vamos destrinchar cada componente da tela para entendermos melhor. Na linha 1, int main(void) refere-se à função principal do programa: a função main(). Veremos melhor sobre o que se trata uma função em outro momento deste tutorial, mas basicamente, a função main() é o "ponto de partida" de um programa em C, ou seja, onde o programa inicia sua execução. Traduzindo para o português, main significa principal. A função main() é a primeira função a ser executada quando um executável em C é gerado, chamada por rotinas de inicialização do sistema operacional ao executar o programa. A palavra int que antecede a assinatura da função indica que essa função retorna um valor inteiro para quem a chamou. Uma função pode ou não retornar um valor, veremos isso mais adiante quando falarmos de funções. O void entre parênteses indica explicitamente que a função main() não possui parâmetros e não recebe argumentos para tais parâmetros, mas muitas vezes encontramos códigos com parênteses vazios () indicando que a função pode receber nenhum ou vários argumentos. Iremos ver com mais detalhes sobre declaração de função, parâmetros e argumentos posteriormente. Ainda na linha 1, percebemos a presença de uma chave aberta { após a assinatura da função main, indicando o início do bloco de código da função e, já pulando para a linha 5, a chave fechada } indica que estamos finalizando aquele bloco de código. Na linha 3, a instrução return 0; se refere à uma instrução de retorno, mais precisamente que estamos retornando o valor inteiro 0 à quem chamou a função main(): o sistema operacional. Como declaramos a função main() retornando um valor inteiro, devemos especificar um valor de retorno (precisa ser inteiro) ao término de seu código-fonte. O valor 0 é uma convenção para informarmos ao sistema operacional que o fluxo do programa chegou naquele ponto e, consequentemente, que executou todo o código de maneira correta, portanto, pode encerrar a execução do programa com um status de saída bem-sucedido.

Obs.: Praticamente todas a instruções em linguagem C precisam terminar com ponto e vírgula ; para indicar, justamente, o término do código daquela instrução.

            O código-fonte acima não faz nada de especial, não recebe nenhuma entrada para fazer algum processamento e gerar uma saída (veja entrada/saída e processamento de dados), apenas demonstra o esqueleto básico de um programa em C. Podemos imprimir uma mensagem no dispositivo de saída do usuário com o seguinte programa:

1    #include <stdio.h>
2
3    int main(void) {
4
5          printf("Hello, World!");
6          return 0;
7
8    }

            Agora o código está levemente modificado, na linha 1 temos a inclusão de um arquivo de cabeçalho, mais precisamente o arquivo que contém declarações de funções de entrada/saída de informações: stdio.h. Só nesta linha podemos observar três conceitos essenciais em programação em C: arquivos de cabeçalho, bibliotecas e diretivas de pré-processamento. Os dois primeiros iremos ver em outro momento e o último conceito nem vamos abordar nesse tutorial básico, pois não se trata de algo muito trivial e requer conhecimento um pouco mais avançado para entendê-lo.

Obs.: Arquivos de cabeçalho possuem extensão .h.

            Na linha 5 estamos fazendo uma chamada a função printf(), cuja declaração está contida no arquivo de cabeçalho stdio.h incluso na primeira linha. Essa é uma função de saída de dados da linguagem C e serve, basicamente, para impressão de informações na tela do usuário. Sua forma geral corresponde:

            int printf(const char *format, ...)

            printf vem de print formatted (imprimir formatado) e quer dizer literalmente isso, imprimir uma mensagem formatada na tela. Na assinatura da função, observamos que um valor inteiro é retornado (o número de caracteres escritos) e há parâmetros definidos: o primeiro const char *format se trata de um ponteiro para uma string constante de nome format que pode receber uma string com ou sem especificadores de tipo e o segundo ... indica que inúmeras variáveis e/ou tipos de dados podem corresponder aos especificadores de tipo informados na string.

            Não entraremos em muitos detalhes agora, só precisamos entender que aquela função printf() irá mostrar uma mensagem de texto ao usuário: a mensagem Hello, World!

Obs.: "Hello, world" é uma convenção para um primeiro código executado quando um programador está iniciando seus estudos em alguma linguagem de programação, de modo a verificar se o ambiente de programação está configurado corretamente e se a tarefa básica de saída de dados está sendo executada.

            Pode-se perceber que as instruções printf("Hello, World!"); e return 0; estão com um certo espaçamento à direita em relação ao resto do código, isso se chama indentação. A indentação sugere uma certa hierarquia entre os elementos do programa, no nosso exemplo, indica que as instruções indentadas estão subordinadas ao bloco de código da função main(), que representa o bloco principal. Se houvesse mais blocos dentro da main(), outras identações apareceriam para estruturar as instruções dentro de cada um dos blocos. A indentação não é obrigatória, o programa poderia ser escrito da seguinte forma:

1    #include <stdio.h>
2
3    int main(void) {
4
5    printf("Hello, World!");
6    return 0;
7
8    }

            porém, nota-se que a legibilidade fica prejudicada e não fica transparente a quem for ler o código que as instruções possuem níveis conceituais diferentes. Portanto, adota-se a indentação como um consenso e, principalmente, como um padrão de projeto para estruturar um programa em uma linguagem de programação.

            Uma vez criado o código fonte, podemos compilá-lo para gerar um executável que irá representar aquele código-fonte como um programa de computador em linguagem de máquina. Antes, precisamos salvar o código-fonte como um arquivo com extensão .c (de linguagem C), por exemplo, podemos salvar como hello_world.c. Para compilar, abriremos o prompt do Windows ou o terminal do Linux e entraremos no diretório onde o código-fonte foi salvo com o comando cd:

1ª imagem

            No diretório, compilaremos o código-fonte usando o GCC com comando abaixo:

2ª imagem

Obs.: -o indica como será chamado o output (saída compilada) do programa hello_world.c: hello_world.

            Se não aparecer nenhuma mensagem (por exemplo, um aviso de erro de sintaxe) significa que o programa foi compilado corretamente. Para executá-lo, basta chamar o executável gerando com o comando abaixo:

3ª imagem

Obs.: Ao gerar um executável, não é preciso especificar a extensão .exe em seu nome, pois o próprio compilador (ou o linker) irá chamá-lo assim.

            Se a mensagem Hello, World! foi impressa como na imagem acima, significa que a compilação deu certo e, desse modo, criamos nosso primeiro programa em linguagem C.

Obs.: Para compilar no Linux, a única alteração a ser feita é na hora de executar o programa: ao invés de hello_world.exe, o comando deve ser ./hello_world.

            Além de codificarmos nossas instruções no código-fonte, podemos incluir comentários que documentam as partes do código. Podem ser colocados em qualquer lugar, uma vez que os comentários não são compilados e não implicam na execução do programa, apenas servem para explicar o que está sendo feito naquele escopo do código. Há duas formas de fazer comentários: comentário de uma única linha e comentário de várias linhas. Abaixo, um exemplo de comentário de uma única linha:

1    #include <stdio.h>
2
3    int main(void) {
4
5          // A instrução abaixo imprime uma mensagem na tela
6          printf("Hello, World!");
7          return 0;
8
9    }

            Comentários de uma única linha são feitos com barra dupla // e só comentam aquela linha em específico, no nosso caso, a linha 5. Abaixo um exemplo de comentário de várias linhas:

1    #include <stdio.h>
2
3    int main(void) {
4
5          /* A instrução abaixo
6          imprime uma
7          mensagem na tela */
8          printf("Hello, World!");
9          return 0;
10
11    }

            Comentários de várias linhas são iniciados com barra e asterisco /* e finalizados com asterisco e barra */ e comentam todas as linhas presentes entre esses dois marcadores, no nosso caso, da linha 5 até a linha 7.

Página anterior

Próxima página