Anatomia de um programa C, o primeiro "Hello, World!" e como compilar no Code::Blocks
Todo programa em C é formado por três elementos fundamentais que aparecem sempre juntos e sempre na mesma ordem:
# e são processadas antes da compilação (ex: #include, #define).main() é obrigatória e é o ponto de entrada de todo programa.;.Diferentemente do Java, que organiza o código em classes e objetos, o C é uma linguagem procedural: o código é organizado em funções independentes, sem o conceito de classe. Isso o torna mais próximo do hardware e mais simples em sua estrutura base.
{ } para delimitar blocos de código e ponto e vírgula ; para encerrar cada instrução. Quem já conhece Java sentirá essa familiaridade imediatamente.
Por convenção histórica, o primeiro programa aprendido em qualquer linguagem imprime "Hello, World!" na tela. Em C, ele tem a seguinte forma:
/* hello.c — Meu primeiro programa em C */
#include <stdio.h>
int main() {
printf("Olá, Mundo!\n");
return 0;
}
Cada linha desse programa tem um papel bem definido. Veja a anatomia completa:
| Linha | O que é | O que faz |
|---|---|---|
/* ... */ |
Comentário de bloco | Texto ignorado pelo compilador; serve para documentar o código. |
#include <stdio.h> |
Diretiva de pré-processador | Importa a biblioteca padrão de entrada e saída (Standard Input/Output), que fornece as funções printf e scanf. |
int main() |
Declaração da função principal | Define o ponto de entrada obrigatório do programa. O int indica que a função retorna um número inteiro ao sistema operacional. |
{ } |
Chaves de bloco | Delimitam o corpo da função main. Todo o código do programa fica entre essas chaves. |
printf("Olá, Mundo!\n"); |
Chamada de função | Imprime o texto na tela. O \n é um caractere especial de nova linha (equivalente ao Enter). |
return 0; |
Instrução de retorno | Encerra a função main e retorna o valor 0 ao sistema operacional, sinalizando que o programa terminou com sucesso. |
.c (exemplo: hello.c). Crie sempre uma pasta dedicada para seus projetos C e evite espaços ou caracteres especiais nos nomes de pastas e arquivos.
Dentro das aspas do printf, certos pares de caracteres têm significado especial. Eles são chamados de sequências de escape e permitem inserir formatação no texto de saída:
| Sequência | Nome | Efeito |
|---|---|---|
\n |
Nova linha (newline) | Move o cursor para a próxima linha |
\t |
Tabulação horizontal (tab) | Insere um recuo de tabulação |
\\ |
Barra invertida literal | Imprime o caractere \ |
\" |
Aspas duplas literais | Imprime o caractere " dentro da string |
\0 |
Caractere nulo | Marca o fim de uma string (veremos mais adiante) |
#include <stdio.h>
int main() {
printf("Linha 1\nLinha 2\n"); // quebra de linha
printf("Nome:\tCarlos\n"); // tabulação
printf("Ele disse: \"Olá!\"\n"); // aspas dentro do texto
return 0;
}
Linha 1
Linha 2
Nome: Carlos
Ele disse: "Olá!"
Para receber dados digitados pelo usuário, o C usa a função scanf. Ela é o equivalente da classe Scanner do Java. Veja um exemplo completo:
#include <stdio.h>
int main() {
int numero;
printf("Digite um número: ");
scanf("%d", &numero); // lê um inteiro e armazena em 'numero'
printf("Você digitou: %d\n", numero);
return 0;
}
Digite um número: 42
Você digitou: 42
scanf onde na memória ele deve gravar o valor digitado. Sem o &, o programa compila, mas se comporta de forma imprevisível, pois o scanf não saberia o endereço de destino do dado.
O símbolo %d dentro do scanf e do printf é chamado de especificador de formato. Ele indica o tipo do dado que será lido ou impresso:
| Especificador | Tipo de dado | Exemplo |
|---|---|---|
%d |
Inteiro (int) |
printf("%d", 42); |
%f |
Ponto flutuante (float) |
printf("%f", 3.14); |
%lf |
Ponto flutuante duplo (double) |
scanf("%lf", &x); |
%c |
Caractere (char) |
printf("%c", 'A'); |
%s |
String (texto) | printf("%s", "Olá"); |
%p |
Endereço de memória (ponteiro) | printf("%p", &x); |
char com scanf: Sempre coloque um espaço antes de %c ao usar scanf:
scanf(" %c", &letra); // o espaço descarta o '\n' que ficou no buffer
Sem o espaço, o scanf pode capturar a tecla Enter da leitura anterior em vez do caractere desejado.
Se você conhece Java, as diferenças de estrutura ficam muito claras quando colocamos os dois programas equivalentes lado a lado:
| C | Java |
|---|---|
#include <stdio.h>
int main() {
int numero;
printf("Digite: ");
scanf("%d", &numero);
printf("Valor: %d\n", numero);
return 0;
}
|
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Digite: ");
int numero = sc.nextInt();
System.out.println("Valor: " + numero);
}
}
|
main().#include é uma diretiva de pré-processador; em Java, import é uma instrução da linguagem.printf com especificadores de formato (%d, %f); em Java, usa-se System.out.println com concatenação de strings.scanf com o operador &; em Java, usa-se o objeto Scanner.main retorna um int ao sistema; em Java, main é void.O Code::Blocks com MinGW é o ambiente recomendado para este curso. Para criar, compilar e executar seu primeiro programa C, siga estes passos:
No menu, vá em File > New > Project. Escolha o template Console Application, clique em Go e selecione a linguagem C (não C++).
Dê um nome ao projeto (ex: hello) e escolha uma pasta para salvá-lo. Evite espaços e acentos no caminho do diretório — isso pode causar erros de compilação no Windows.
O Code::Blocks cria automaticamente um arquivo main.c com um esqueleto básico. Substitua o conteúdo pelo seu código.
Pressione F9 (ou clique no botão Build and Run). O Code::Blocks compila o código e já executa se não houver erros. O log de compilação aparece no painel inferior — verifique se aparece a mensagem 0 error(s).
;, esquecer o & no scanf, ou escrever Printf com P maiúsculo (C é case-sensitive).
Para executar sem recompilar, use Ctrl + F10. Uma janela de console exibirá a saída do programa ou aguardará a entrada do usuário, conforme o código.
gcc main.c -o hello ./hello // Linux / macOS hello.exe // WindowsO flag
-o hello define o nome do arquivo executável gerado.
Vamos juntar tudo o que vimos nesta aula em um programa que lê o nome e a idade do usuário e exibe uma mensagem formatada:
#include <stdio.h>
int main() {
int idade;
char nome[50]; // vetor de 50 caracteres (veremos mais adiante)
printf("Qual é o seu nome? ");
scanf("%s", nome); // lê uma palavra (sem espaços)
printf("Qual é a sua idade? ");
scanf("%d", &idade);
printf("\nOlá, %s! Você tem %d anos.\n", nome, idade);
return 0;
}
Qual é o seu nome? Ana
Qual é a sua idade? 22
Olá, Ana! Você tem 22 anos.
scanf("%s", nome) não usa o operador & neste caso — porque nome é um array e o nome de um array já é, por si só, o endereço do seu primeiro elemento. Esse comportamento será explicado em detalhes na Aula de Arrays.
Responda às questões abaixo para fixar os conceitos da aula: