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:

C
#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.

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

C
int main(void) {
    return 0;
}
🔥 Erro Comum: 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:

C
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.

⚠️ Atenção: Alguns livros antigos usam 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.

C
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:

C
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:

C
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.

💡 Dica: Um ponto e vírgula sozinho também é uma instrução válida, chamada de instrução nula — não faz nada:

C
;

É ú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):

C
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:

C
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.

⚠️ Atenção: Mesmo que um bloco de código contenha apenas uma instrução, é melhor incluir as chaves. Isso previne bugs quando você adiciona mais instruções depois e esquece de colocar as chaves.

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

C
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:

C
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 %
💡 Dica: Você pode usar vários especificadores em um único printf — eles correspondem aos argumentos na ordem:

C
int a = 3, b = 4;
printf("%d + %d = %d\n", a, b, a + b);

Largura e Alinhamento

C
printf("[%5d]\n", 42);
printf("[%-5d]\n", 42);
printf("[%05d]\n", 42);
TEXT
[   42]
[42   ]
[00042]

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
⚠️ Atenção: Ao imprimir caminhos de arquivos, você deve usar barra invertida dupla:

C
printf("C:\\Users\\admin\\file.txt\n");
TEXT
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:

C
int pontuacao = 100;

Comentários de Múltiplas Linhas

Comentários no estilo /* */ podem abranger várias linhas:

C
/*
 * 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:

C
int max_tentativas = 3;

Um comentário desnecessário (o código já explica tudo):

C
int x = 10;
⚠️ Atenção: Comentários de múltiplas linhas não podem ser aninhados. O seguinte causará um erro de compilação:

C
/*
  /* 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:

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:

C
#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;
}
TEXT
=== 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

📝 Exercícios

  1. Escreva um programa que use printf para exibir seu próprio cartão de informações (nome, idade, hobby), usando \t para alinhamento
  2. 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
  3. Escreva intencionalmente um comentário de múltiplas linhas aninhado no seu código e observe a mensagem de erro do compilador
100%