Sintaxe Básica
Aprender a sintaxe básica de C é como aprender os traços dos caracteres chineses — horizontal, vertical, parece simples, mas toda bela caligrafia é construída a partir deles.
Estrutura do Programa
Todo programa em C compartilha um esqueleto fixo. Não importa quão complexo o programa fique, a estrutura central permanece a mesma:
#include <stdio.h>
int main(void) {
return 0;
}
Esse é o menor programa C válido — não faz nada, mas a estrutura está completa. Vamos detalhar:
Diretivas de Pré-processamento
#include <stdio.h> é uma diretiva de pré-processamento. Começa com # e é processada antes da compilação.
#include— Insere o conteúdo do arquivo header especificado neste ponto<stdio.h>— O header padrão de E/S, contendo declarações deprintf,scanfe outras funções- Os sinais de menor e maior
<>dizem ao pré-processador para procurar o header nos diretórios do sistema
Você também encontrará outros headers comuns:
| Header | O Que Fornece |
|---|---|
<stdio.h> |
Entrada/saída (printf, scanf) |
<stdlib.h> |
Utilidades gerais (malloc, exit) |
<math.h> |
Funções matemáticas (sqrt, sin) |
<string.h> |
Operações com strings (strlen, strcpy) |
<ctype.h> |
Classificação de caracteres (isdigit, toupper) |
A Função main
int main(void) {
return 0;
}
int— A função retorna um inteiromain— O nome da função; C especifica que a execução do programa começa na função main(void)— Uma lista de parâmetros vazia, significando que a função não recebe argumentos{ }— O corpo da função, delimitado por chavesreturn 0— Retorna 0 para indicar que o programa terminou normalmente
main é o único ponto de entrada de um programa em C. Você só pode ter uma função main — o sistema operacional a chama para iniciar seu programa.
Outras Formas de main
Você pode ver uma forma diferente de main em alguns livros:
int main(int argc, char *argv[])
Essa forma pode receber argumentos de linha de comando, que abordaremos em detalhes mais adiante. Por enquanto, int main(void) é tudo o que você precisa.
void main(). Isso não é C padrão e alguns compiladores emitirão um aviso. Sempre use int main(void).
Instruções e Ponto e Vírgula
Em C, o ponto e vírgula ; marca o fim de uma instrução. Pense nisso como um ponto final — assim como uma frase precisa de um ponto, uma instrução precisa de um ponto e vírgula.
int idade = 18;
idade = idade + 1;
printf("Tenho %d anos\n", idade);
Cada linha é uma instrução, terminando com ponto e vírgula.
Um erro comum — esquecer o ponto e vírgula:
int idade = 18
O compilador não reconhece "quebras de linha" — só reconhece pontos e vírgulas. Teoricamente, você poderia escrever todo o código em uma linha:
int idade = 18; idade = idade + 1; printf("%d\n", idade);
Embora seja sintaticamente válido, isso nunca é recomendado. Um bom estilo de codificação coloca uma instrução por linha.
;
É útil em certos casos especiais (como um corpo de loop vazio), mas você não precisa se preocupar com isso agora.
Blocos de Código
Um grupo de instruções delimitado por chaves {} forma um bloco de código (também chamado de instrução composta):
int main(void) {
int x = 10;
int y = 20;
int soma = x + y;
printf("Soma = %d\n", soma);
return 0;
}
Todo o corpo da função main é um bloco de código. Blocos de código definem escopo — variáveis declaradas dentro de um bloco não podem ser acessadas fora dele.
Blocos de código podem ser aninhados:
int main(void) {
int a = 1;
{
int b = 2;
printf("a + b = %d\n", a + b);
}
return 0;
}
O bloco interno pode acessar o a externo, mas o bloco externo não pode acessar o b interno.
A Função printf
printf é a função de saída mais usada em C. O nome vem de print formatted (impressão formatada).
Uso Básico
printf("Olá, Mundo!\n");
O conteúdo dentro das aspas duplas é chamado de string de formato e é impresso como está (exceto os caracteres de escape).
Especificadores de Formato
O poder de printf está em formatar valores de variáveis para saída:
int idade = 18;
float altura = 1.75f;
char nota = 'A';
printf("Idade: %d\n", idade);
printf("Altura: %.2f\n", altura);
printf("Nota: %c\n", nota);
Especificadores de formato comuns:
| Especificador | Tipo | Exemplo de Saída |
|---|---|---|
%d |
int | 42 |
%f |
float / double | 3.140000 |
%.2f |
float (2 casas decimais) | 3.14 |
%c |
char | A |
%s |
string | olá |
%ld |
long | 100000 |
%x |
inteiro hexadecimal | 2a |
%o |
inteiro octal | 52 |
%% |
sinal de porcentagem literal | % |
printf — eles correspondem aos argumentos na ordem:
int a = 3, b = 4;
printf("%d + %d = %d\n", a, b, a + b);
Largura e Alinhamento
printf("[%5d]\n", 42);
printf("[%-5d]\n", 42);
printf("[%05d]\n", 42);
[ 42]
[42 ]
[00042]
%5d— Largura mínima 5, alinhado à direita%-5d— Largura mínima 5, alinhado à esquerda%05d— Largura mínima 5, preenchido com zeros
Caracteres de Escape
Alguns caracteres não podem ser digitados diretamente em uma string (como nova linha ou tab), então são representados por caracteres de escape que começam com barra invertida \:
| Escape | Significado | Exemplo |
|---|---|---|
\n |
Nova linha | printf("A\nB") imprime A e B em linhas separadas |
\t |
Tabulação horizontal | Comumente usado para saída alinhada |
\\ |
Barra invertida literal | Para imprimir \, escreva \\ |
\" |
Aspas duplas | Para imprimir " dentro de uma string |
\' |
Aspas simples | Para imprimir ' dentro de um literal de caractere |
\0 |
Caractere nulo | Marca o fim de uma string |
\r |
Retorno de carro | Move o cursor para o início da linha |
\b |
Backspace | Move o cursor uma posição à esquerda |
printf("C:\\Users\\admin\\file.txt\n");
C:\Users\admin\file.txt
Comentários
Comentários são anotações para humanos — o compilador os ignora completamente. Bons comentários tornam o código mais fácil de entender.
Comentários de Uma Linha
C99 introduziu comentários de uma linha com //. Tudo de // até o final da linha é um comentário:
int pontuacao = 100;
Comentários de Múltiplas Linhas
Comentários no estilo /* */ podem abranger várias linhas:
/*
* Este programa calcula
* a soma de dois números
*/
#include <stdio.h>
int main(void) {
int a = 10;
int b = 20;
printf("%d\n", a + b);
return 0;
}
Boas Práticas de Comentários
Comentários devem explicar o porquê (o raciocínio), não o o quê (o óbvio). O código em si já te diz o quê — comentários devem complementar com a intenção de design e decisões que o código não consegue expressar.
Um bom comentário:
int max_tentativas = 3;
Um comentário desnecessário (o código já explica tudo):
int x = 10;
/*
/* comentário aninhado */
*/
O */ interno fecha prematuramente o comentário externo, deixando o */ restante como um erro de sintaxe.
Identificadores e Palavras-chave
Regras de Nomenclatura de Identificadores
Identificadores são nomes que você cria (nomes de variáveis, funções, etc.). Eles devem seguir estas regras:
- Só podem conter letras (a-z, A-Z), dígitos (0-9) e underscores (_)
- Devem começar com uma letra ou underscore — não podem começar com um dígito
- Diferenciam maiúsculas de minúsculas (
idadeeIdadesão identificadores diferentes) - Não podem usar palavras-chave de C
Nomes válidos: idade, nome_do_aluno, _contador, TAM_MAX
Nomes inválidos: 2nome (começa com dígito), minha-idade (contém hífen), int (palavra-chave)
Convenções de Nomenclatura
| Estilo | Formato | Caso de Uso | Exemplo |
|---|---|---|---|
| snake_case | minúsculas + underscores | Nomes de variáveis, funções | quantidade_alunos |
| UPPER_CASE | TUDO MAIÚSCULO + underscores | Constantes | TAM_BUFFER_MAX |
| CamelCase | Maiúscula em cada palavra | Nomes de tipos personalizados | InfoAluno |
C tradicionalmente usa snake_case, ao contrário de Java/C# que favorecem camelCase. O mais importante é a consistência dentro de um projeto.
Palavras-chave do C99
C99 tem 37 palavras-chave, todas em minúsculas:
| Categoria | Palavras-chave |
|---|---|
| Tipos de Dados | char short int long float double void signed unsigned _Bool _Complex _Imaginary |
| Fluxo de Controle | if else switch case default for while do break continue goto return |
| Classes de Armazenamento | auto extern static register typedef inline |
| Estruturas | struct union enum |
| Outros | const volatile sizeof restrict |
Você não precisa decorar tudo — elas se tornarão naturais com a prática. O que importa é saber que palavras-chave não podem ser usadas como identificadores.
Exemplo
Vamos combinar tudo deste capítulo em um programa que demonstra a sintaxe básica:
#include <stdio.h>
int main(void) {
printf("=== Info do Aluno ===\n");
printf("Nome:\t%s\n", "Alice");
printf("Idade:\t%d\n", 20);
printf("Nota:\t%.1f\n", 95.5);
printf("Conceito:\t%c\n", 'A');
printf("====================\n");
return 0;
}
=== Info do Aluno ===
Nome: Alice
Idade: 20
Nota: 95.5
Conceito: A
====================
Esse programa demonstra: a diretiva de pré-processamento #include, a estrutura da função main, saída formatada com printf, nova linha com \n, alinhamento com tab \t, e quatro especificadores de formato comuns (%d, %.1f, %c, %s).
❓ Perguntas Frequentes
P: Por que C usa ponto e vírgula em vez de quebras de linha para separar instruções? R: Porque C permite que uma única instrução ocupe várias linhas e múltiplas instruções em uma linha. Ponto e vírgula é mais flexível como delimitador — o compilador não precisa se preocupar com a formatação do código.
P: O que significa o 'f' em printf? R: 'f' significa "formatted" (formatada). printf não imprime apenas texto fixo — pode inserir valores de variáveis na saída usando especificadores como %d e %f. É isso que significa "saída formatada".
P: Muitos comentários deixam meu programa mais lento? R: De jeito nenhum. O compilador remove todos os comentários durante o pré-processamento, então o executável compilado contém zero conteúdo de comentários. Escreva quantos comentários quiser — eles não têm efeito na performance.
P: Devo usar void main ou int main? R: Sempre use int main(void). O padrão C exige explicitamente que main retorne int. void main é uma extensão não padronizada de alguns compiladores antigos — compiladores modernos podem avisar ou até rejeitar.
📖 Resumo
- Esqueleto de um programa C: header
#include+ funçãoint main(void)+return 0 - Ponto e vírgula marca o fim de instruções; toda instrução deve terminar com um
- Chaves
{}formam blocos de código e definem o escopo de variáveis - printf usa especificadores de formato para exibir diferentes tipos de dados:
%d,%f,%c,%s - Caracteres de escape começam com
\:\npara nova linha,\tpara tab,\\para barra invertida literal
📝 Exercícios
- Escreva um programa que use printf para exibir seu próprio cartão de informações (nome, idade, hobby), usando \t para alinhamento
- Escreva um programa que use uma única chamada de printf para exibir o seguinte (usando caracteres de escape para novas linhas e tabs): Nome Alice, Idade 25, Cidade São Paulo
- Escreva intencionalmente um comentário de múltiplas linhas aninhado no seu código e observe a mensagem de erro do compilador



