Explicação do primeiro programa em C

Explicação do primeiro programa em C

Na aula anterior instalamos o compilador GCC e criamos o exemplo mais simples do hello world. Nesta aula, vamos analisar esse exemplo linha por linha. Primeiro, veja o código abaixo:

#include <stdio.h>

int main()
{
    printf("hello, world\n");
    return 0;
}
Code language: Arduino (arduino)

O código é muito simples, ele apenas exibe uma linha de texto na tela.

Em seguida, vamos analisar cada linha do código de cima para baixo.

1. #include <stdio.h>

Na primeira aula citamos brevemente o pré-processamento, e essa primeira linha é uma instrução de pré-processamento. Como identificamos isso? Pelo símbolo #.

#: Marcador de instrução de pré-processamento, enviado ao pré-processador e executado no primeiro passo da compilação.

include: Palavra-chave para importar arquivos de cabeçalho, sua função é copiar todo o conteúdo do arquivo especificado para dentro do programa atual.

<stdio.h>: Arquivo de cabeçalho padrão de entrada e saída (standard input output). Ele contém funções para exibir texto na tela e ler dados do teclado; a função printf usada abaixo está definida nesse arquivo.

Estritamente falando, o pré-processamento não faz parte da sintaxe da linguagem C. O pré-processamento do C não é um componente da sintaxe principal da linguagem C, é uma etapa independente executada pelo compilador antes da compilação efetiva. Ele integra o fluxo completo de compilação, mas não pertence ao sistema sintático e semântico nativo do C.

Resumindo: um programa separado de pré-processamento realiza substituições de texto. No caso do #include <stdio.h>, toda a codificação do arquivo stdio.h é copiada para esse local, substituindo a linha original. Suponha que o arquivo stdio.h contenha apenas o texto AAAAAAAAA.

Então, antes do código ser enviado ao compilador, ele ficaria assim:

 AAAAAAAAA

int main()
{
    printf("hello, world\n");
    return 0;
}
Code language: Arduino (arduino)

Claro que isso é apenas uma suposição, o conteúdo real do arquivo de cabeçalho é muito mais complexo. Quem tiver curiosidade pode abrir o arquivo para conferir.

Esse arquivo de cabeçalho fica armazenado no seu computador, o caminho varia conforme o sistema operacional:

Sistemas Linux/Unix: Geralmente em /usr/include/stdio.h

Windows (Visual Studio): Em VC/include/stdio.h

macOS (Xcode): Em /Applications/Xcode.app/.../usr/include/stdio.h

Você pode usar ferramentas de busca para localizar esse arquivo na sua máquina.

Agora você já entende o funcionamento básico do pré-processamento?

Se remover a linha #include <stdio.h>, o compilador não reconhecerá a função printf e lançará um erro. Tente apagar essa linha e compilar com o gcc para ver o resultado.

Após remover o arquivo de cabeçalho

Ao compilar novamente, uma mensagem de erro será exibida

2. int main()

main = Função de ponto de entrada de qualquer programa em C

  1. Ao executar qualquer programa C, o sistema operacional inicia automaticamente pela função main. Cada programa pode ter apenas uma função main.
  2. int: Tipo do valor retornado pela função, abreviação de integer (número inteiro).
  3. (): Indica que se trata de uma função; dentro dos parênteses podemos declarar parâmetros, parênteses vazios significam que a função não recebe parâmetros.

Essa estrutura do main foi herdada pela maioria das linguagens de programação posteriores, ele é o único ponto de início do programa. Ao clicar duas vezes em um arquivo exe ou digitar um comando no terminal (como hello), o sistema operacional chama automaticamente essa função main.

O int no início representa o tipo de retorno da função. Quando criarmos nossas próprias funções nas aulas seguintes, precisaremos sempre declarar esse tipo, explicaremos tudo em detalhes depois.

Os parênteses () servem para declarar quais parâmetros a função aceita; aqui estão vazios, então a função não recebe nenhum dado. Também existe uma versão com parâmetros:

int main(int argc, char *argv[])Code language: CSS (css)

Essa forma aceita dois parâmetros: um inteiro e um vetor de strings, esse conteúdo será explicado nas próximas aulas.

Os parâmetros da função main são enviados pelo sistema operacional, mas de onde vêm esses valores?

Você certamente já usou comandos de terminal como o ping. Por exemplo, ping 12.36.4.xxx testa uma conexão de rede: ping corresponde ao programa ping.exe, e o IP 12.36.4.xxx é um parâmetro passado para a função main do ping.exe.

Da mesma forma, se executar hello abc no terminal, abc será enviado como parâmetro para o nosso programa. As variáveis dentro dos parênteses do main recebem esses valores digitados pelo usuário e repassados pelo sistema operacional.

Guarde essa ideia por enquanto: main é o único ponto de entrada do programa, só pode haver um, é invocado pelo sistema operacional, e os argumentos da linha de comando são enviados ao main via SO.

3. { } Chaves

Delimitam o corpo da função: { marca o início do código da função, } o fim. Todo o código da função deve ficar entre as duas chaves.

4. printf("hello, world\n");

  • printf: Abreviação de print format, função de saída formatada que exibe texto no console.
  • Aspas duplas " ": Delimitam uma cadeia de caracteres constante, o texto que queremos imprimir fica dentro delas.
  • \n: Caractere de escape, quebra de linha: após imprimir o texto, o cursor pula automaticamente para a linha seguinte.
  • ;: Marcador de fim de instrução em C. Cada linha executável deve terminar com ponto e vírgula; se esquecido, ocorre erro de compilação.

A letra f no final do nome da função significa format (formatação), aprofundaremos esse tópico depois. Por agora, entenda que essa linha exibe o texto hello, world\n no console e o \n insere uma quebra de linha automática.

5. return 0;

  • return: Retorna um número inteiro para a função main e encerra sua execução. Por que precisamos do return? Porque declaramos que main retorna um int, então é obrigatório devolver um valor inteiro dentro da função.
  • 0: Convenção universal que indica que o programa terminou sem erros, de forma normal, serve para avisar o sistema operacional sobre o resultado da execução.
    • Retornar 0 = Execução do programa bem-sucedida
    • Retornar um número diferente de 0 (ex: return 1;) = O programa foi interrompido com erro

Os padrões modernos de C permitem omitir o return 0; no final do main, o compilador adiciona ele automaticamente. Mesmo assim, recomenda-se que iniciantes escrevam explicitamente para seguir as regras padrão.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *