C Introdução

O C (lê-se "cê") é uma linguagem de programação pequena, criada em 1972, feita para escrever programas rápidos que falam quase diretamente com o computador. Ela é compilada: antes de rodar, o seu texto é traduzido para a língua do processador. Nesta aula você vai entender o que isso quer dizer, de onde o C veio, onde ele está hoje (muito provavelmente dentro do aparelho em que você lê esta página) e como ele se compara com o C++ e o Python.

Você vai aprender
  • O que é programar e o que é uma linguagem de programação.
  • O que é uma linguagem compilada e por que isso deixa o C rápido.
  • A história: Dennis Ritchie, o Bell Labs e o sistema Unix.
  • Onde o C está hoje: Linux, Git, Python, SQLite, microcontroladores.
  • As vantagens do C e os cuidados que ele exige.
  • Como o C se compara com o C++ e o Python.

Primeiro: o que é programar?

Um computador não "entende" nada sozinho. Ele só sabe seguir instruções, uma de cada vez, muito rápido. Programar é escrever essas instruções. Uma linguagem de programação é o idioma combinado entre você e o computador: um conjunto de palavras e símbolos com regras rígidas (onde vai o ponto e vírgula, onde abrem e fecham as chaves).

Pense numa receita de bolo. Ela tem uma lista de passos, em ordem: "pré-aqueça o forno", "misture os ovos com o açúcar", "se a massa estiver grossa, acrescente leite". Um programa é igual: uma lista de passos, alguns com decisões ("se…") e repetições ("bata até ficar homogêneo"). A diferença é que o computador segue a receita ao pé da letra. Se você escrever pritnf em vez de printf, ele não adivinha o que você quis dizer: ele para e reclama. Essas reclamações são as mensagens de erro, e o guia vai ensinar você a lê-las.

A língua do processador

O processador (a CPU, o "cérebro" do computador) não entende português, nem inglês, nem C. Ele só entende código de máquina: números que querem dizer coisas como "some estes dois valores" ou "guarde isto na memória". Escrever programas diretamente em números seria um pesadelo. Por isso existem as linguagens de programação, que são feitas para pessoas lerem e escreverem.

Alguém precisa traduzir o texto da linguagem para os números do processador. Existem dois jeitos de fazer isso:

JeitoComo funcionaComparaçãoExemplos
CompilarUm programa chamado compilador traduz o texto inteiro antes, uma vez só, e gera um arquivo executável. Depois, o executável roda sozinho, quantas vezes você quiser.Traduzir um livro inteiro e imprimir a tradução. Quem lê a versão traduzida não precisa do tradutor.C, C++, Rust, Go
InterpretarUm programa chamado interpretador lê o texto e vai executando linha por linha, toda vez que o programa roda.Um intérprete numa palestra, traduzindo frase por frase enquanto a pessoa fala. Sem o intérprete na sala, ninguém entende.Python, JavaScript, PHP

O C é compilado. Essa é a principal razão de ele ser tão rápido: quando o programa roda, a tradução já foi feita, e o processador só executa. O compilador mais usado no Linux, e o que aparece nos terminais deste guia, é o gcc (GNU Compiler Collection, "coleção de compiladores do projeto GNU"). A aula Como o C Vira Programa mostra a tradução acontecendo, etapa por etapa.


O que é o C

O C é uma linguagem de uso geral (serve para quase qualquer tipo de programa), mas brilha num lugar específico: programas que precisam ser rápidos, pequenos e próximos da máquina. Três características explicam isso:

  • Rápido. O compilador gera código de máquina, e a linguagem não coloca nada "no meio do caminho": cada linha de C vira poucas instruções do processador.
  • Pequeno. A linguagem inteira cabe num livro fino. Ela tem pouco mais de 50 palavras reservadas (eram 32 no primeiro padrão) (int, if, while, return…) e uma biblioteca padrão enxuta. Dá para aprender o C inteiro, coisa rara entre as linguagens.
  • Perto da máquina. Em C você mexe diretamente na memória: sabe onde cada dado está guardado e quantos bytes ele ocupa. É por isso que sistemas operacionais e programas de aparelhos eletrônicos são escritos em C.

Veja um programa C pequeno. Ele faz uma conta simples dez milhões de vezes (somar o resto da divisão de cada número por 7) e mostra o total:

#include <stdio.h>

int main(void) {
    long long total = 0;
    for (long long i = 0; i < 10000000; i++) {
        total += i % 7;
    }
    printf("%lld\n", total);
    return 0;
}

Não se preocupe em entender cada linha agora: long long é um tipo de número inteiro grande (aula Inteiros), o for repete um trecho (aula for), o % calcula o resto da divisão (aula Operadores Aritméticos) e o %lld diz ao printf para escrever um long long (aula Formatos do printf). A Ana escreveu o mesmo programa em Python, uma linguagem interpretada:

total = 0
for i in range(10000000):
    total += i % 7
print(total)

E mediu o tempo dos dois com o comando time, que mostra quanto um programa demorou (a linha real é o tempo de relógio):

$ gcc -std=c23 -Wall -Wextra conta.c -o conta
$ time ./conta
29999994

real	0m0,048s                       « C: 48 milésimos de segundo
user	0m0,047s
sys	0m0,001s
$ time python3 conta.py
29999994

real	0m1,637s                       « Python: mais de um segundo e meio
user	0m1,630s
sys	0m0,007s

Mesmo resultado, e o C foi uns 30 vezes mais rápido nesta conta, na máquina da Ana. Os números exatos mudam de computador para computador e de programa para programa, e o Python tem truques (bibliotecas escritas em C) para chegar perto em muitas tarefas. Mas a ordem de grandeza é essa: em contas pesadas, um programa compilado costuma ganhar com folga.

Rode o programa aqui. A caixa compila o código com um compilador C real e mostra o resultado:

Experimente: rode como está e confira o 29999994. Depois troque 10000000 por 10 e rode de novo: o total vira 24 (0+1+2+3+4+5+6+0+1+2). Conferiu de cabeça?

#include <stdio.h>

int main(void) {
    long long total = 0;
    for (long long i = 0; i < 10000000; i++) {
        total += i % 7;
    }
    printf("%lld\n", total);
    return 0;
}

Um pouco de história

O C nasceu de um problema prático. No fim dos anos 1960, Ken Thompson e Dennis Ritchie trabalhavam no Bell Labs, o laboratório de pesquisa da companhia telefônica AT&T, nos Estados Unidos. Os dois estavam criando um sistema operacional novo, o Unix. A primeira versão foi escrita em assembly, a linguagem que é quase o código de máquina, com uma palavra para cada instrução do processador. Funcionava, mas tinha dois problemas: dava muito trabalho escrever, e o programa só servia para aquele modelo de computador. Para levar o Unix a outra máquina, era preciso reescrever tudo.

Thompson criou uma linguagem chamada B, simplificando uma mais antiga, a BCPL. Ritchie foi melhorando o B, acrescentou tipos (dizer se um dado é um número inteiro, um caractere etc.) e, em 1972, a linguagem nova ganhou o nome óbvio: a letra seguinte, C. Em 1973, o núcleo do Unix foi reescrito em C. Foi uma revolução: pela primeira vez um sistema operacional inteiro estava escrito numa linguagem que podia ser compilada para máquinas diferentes. O Unix (e o C junto com ele) se espalhou por universidades e empresas do mundo todo.

AnoO que aconteceu
1969Ken Thompson e Dennis Ritchie começam o Unix no Bell Labs, escrito em assembly. Thompson cria a linguagem B.
1972Dennis Ritchie cria o C, a partir do B.
1973O núcleo do Unix é reescrito em C.
1978Brian Kernighan e Dennis Ritchie publicam o livro The C Programming Language, chamado de "K&R" pelas iniciais dos autores. Por mais de dez anos, o livro foi a definição do C. É dele a tradição de começar com um programa que escreve hello, world.
1983Thompson e Ritchie recebem o Prêmio Turing, o "Nobel da computação", pelo Unix.
1989–1990Primeiro padrão oficial: o ANSI C (C89), adotado pela ISO (a organização internacional de normas) em 1990 como C90. A partir daí, o C é decidido por um comitê internacional.
1991Linus Torvalds, um estudante finlandês, começa o Linux, escrito em C.
2011Morre Dennis Ritchie, aos 70 anos.
2024Sai oficialmente o C23, a versão que este guia ensina (aula Versões do C).

Rode a linha do tempo abaixo. Cada linha com printf escreve um ano e um acontecimento:

Missão: a linha do tempo parou em 1991. Copie a última linha com printf, cole logo abaixo dela e mude o texto para 2024: sai o C23. Rode e confira que a lista ganhou uma linha.

#include <stdio.h>

int main(void) {
    printf("1969: começa o Unix\n");
    printf("1972: nasce o C\n");
    printf("1978: o livro K&R\n");
    printf("1989: ANSI C, o primeiro padrão\n");
    printf("1991: nasce o Linux, escrito em C\n");
    return 0;
}
#include <stdio.h>

int main(void) {
    printf("1969: começa o Unix\n");
    printf("1972: nasce o C\n");
    printf("1978: o livro K&R\n");
    printf("1989: ANSI C, o primeiro padrão\n");
    printf("1991: nasce o Linux, escrito em C\n");
    printf("2024: sai o C23\n");
    return 0;
}
Por que o C mudou a história

Quase todas as linguagens populares de hoje copiaram a "cara" do C: as chaves { } para agrupar instruções, o ; no fim, o if (…), o for (…; …; …), o printf. C++, Java, C#, JavaScript, PHP, Go e Rust são todas "filhas" ou "netas" do C. Quem aprende C reconhece metade de cada uma delas logo de cara.


Onde o C está hoje

Mais de cinquenta anos depois, o C continua em toda parte, quase sempre escondido, fazendo o trabalho pesado:

OndeExemplos concretosPor que C
Sistemas operacionaisO núcleo do Linux (que roda em quase todos os servidores da internet, no Android, em roteadores e TVs) é escrito em C, com uma parte nova em Rust desde 2022. Os núcleos do Windows e do macOS também têm muito C.Precisa falar direto com o hardware e não pode desperdiçar nada.
Ferramentas de programaçãoO Git, que guarda o histórico de quase todo projeto de software do mundo, foi escrito em C por Linus Torvalds em 2005. O curl (que baixa arquivos da internet, presente em bilhões de aparelhos) também é C.Tem de ser rápido e funcionar em qualquer sistema.
Outras linguagensO interpretador mais usado do Python se chama CPython justamente porque é escrito em C. Os interpretadores do PHP, do Ruby e do Lua também. Quando um programa Python roda, é um programa em C que está lendo o seu código.Uma linguagem lenta precisa de um "motor" rápido por baixo.
Bancos de dadosO SQLite, escrito em C, está dentro de todo celular Android e iPhone, dos navegadores e de milhares de aplicativos: é provavelmente o banco de dados mais instalado do mundo. O PostgreSQL e o Redis também são C.Guardar e procurar dados rápido, gastando pouca memória.
MicrocontroladoresOs "computadorzinhos" dentro de micro-ondas, máquinas de lavar, controles remotos, carros, marca-passos e placas como o ESP32 e o STM32 são programados principalmente em C. O Arduino usa um C++ escrito quase todo no estilo do C.Alguns têm só alguns quilobytes de memória: não sobra espaço para linguagens "pesadas".
Servidores e mídiaO nginx (servidor web que entrega boa parte dos sites), o FFmpeg (converte vídeo e áudio; está por trás de muitos players e sites de vídeo) e o OpenSSL (o cadeado do https).Atender milhares de pessoas ao mesmo tempo.
Uma língua que todas as outras falam

O C virou o "idioma comum" entre linguagens. Uma biblioteca escrita em C pode ser usada a partir do Python, do Java, do Rust, do Go e de quase qualquer outra linguagem. É por isso que bibliotecas importantes continuam sendo escritas em C: uma vez escritas, todo mundo pode usar.


Vantagens e cuidados

O C é uma ferramenta poderosa e "sem proteção", como uma faca de chef bem afiada: corta qualquer coisa, inclusive o seu dedo. Conhecer os dois lados ajuda a entender o jeito como este guia ensina.

VantagensCuidados
Velocidade: está entre as linguagens mais rápidas que existem.Sem rede de segurança: se você escrever além do fim de uma lista, o C não impede. O programa pode dar resultados errados, travar ou abrir uma brecha de segurança.
Roda em qualquer lugar: praticamente todo processador do mundo, do supercomputador ao chip de uma torradeira, tem um compilador de C.Memória à mão: quem pede memória (com malloc) tem de devolver (com free). Esquecer causa "vazamentos"; devolver duas vezes causa falhas.
Pequeno e estável: dá para aprender a linguagem inteira, e um programa escrito há 30 anos quase sempre ainda compila hoje.Pouca coisa pronta: o C não tem um tipo "texto" de verdade, nem listas que crescem sozinhas. Você aprende a construir essas coisas (o que ensina muito, mas dá trabalho).
Ensina como o computador funciona: memória, endereços, bytes. Depois do C, as outras linguagens deixam de ser "mágica".Comportamento indefinido: alguns erros não dão mensagem nenhuma; o programa parece funcionar e falha mais tarde, em outro computador (aula Comportamento Indefinido).

Os cuidados são sérios: a Microsoft e o Google já contaram que cerca de 70% das falhas graves de segurança nos seus produtos vinham de erros de memória, o tipo de erro que o C deixa acontecer. A boa notícia é que existem hábitos e ferramentas que pegam a maioria desses erros, e o guia ensina todos desde o começo: compilar sempre com os avisos ligados (-Wall -Wextra, aula Avisos), conferir o que o usuário digitou, usar as funções seguras (fgets, snprintf), e usar o -fsanitize e o Valgrind, que encontram os erros de memória por você.


C, C++ e Python

Quem começa a estudar programação quase sempre ouve falar dessas três. Cada uma brilha num lugar diferente:

CC++Python
Nasceu1972, Dennis Ritchie1985, Bjarne Stroustrup (começou como "C com Classes" em 1979)1991, Guido van Rossum
Como rodaCompilado para código de máquinaCompilado para código de máquinaInterpretado (por um programa escrito em C)
VelocidadeMuito altaMuito altaBaixa em contas puras; alta quando usa bibliotecas escritas em C
Tamanho da linguagemPequena: dá para conhecer inteiraEnorme: pouca gente conhece tudoMédia, com uma biblioteca padrão gigante
MemóriaVocê controla tudo, à mão (malloc e free)Você controla, mas ferramentas modernas liberam sozinhasAutomática: o Python libera o que não é mais usado
Texto e listasArrays de tamanho fixo e strings terminadas em '\0'; o resto você constróiProntos: std::string, std::vectorProntos e fáceis: "texto", [1, 2, 3]
Classes e objetosNão (usa struct e funções)Sim, e templatesSim
Olá, mundoprintf("Olá\n");std::cout << "Olá\n";print("Olá")
Arquivoola.c, compilado com gccola.cpp, compilado com g++ola.py, rodado com python3
Famoso porSistemas operacionais, microcontroladores, bibliotecas, interpretadoresJogos, navegadores, programas grandes que precisam de velocidadeCiência de dados, automação, inteligência artificial

Resumindo: o C é o "avô" pequeno e direto; o C++ pegou o C e acrescentou ferramentas para organizar programas grandes, sem perder a velocidade; o Python troca velocidade por facilidade (e roda em cima de um programa em C). Nenhuma é "a melhor": cada uma resolve um tipo de problema. Se você quiser aprender C++ depois, este site tem um Guia C++ irmão, e quase tudo deste guia vai valer lá também.

C é difícil demais para começar?

O C é pequeno, e isso ajuda: em poucas semanas você conhece quase todas as palavras da linguagem. A parte difícil (ponteiros e memória) fica para o Nível 2, quando você já estiver à vontade com o resto. E existe uma vantagem enorme: quem aprende C aprende como o computador funciona de verdade, e depois qualquer outra linguagem fica mais fácil.


Quando dá errado

Ainda não escrevemos programas, mas há confusões muito comuns em quem está começando com C:

"Achei um curso de C# (ou de C++) pensando que era C"

O que aconteceu: os nomes são parecidos, mas são linguagens diferentes. O C# (lê-se "cê sharp") é uma linguagem da Microsoft, de 2000, mais parecida com o Java do que com o C. O C++ é a linguagem que nasceu do C e acrescentou muita coisa. Muito material "de C" na internet é, na verdade, C++.

Como conferir: um programa C tem #include <stdio.h> e printf, e o arquivo termina em .c. Se aparecer #include <iostream>, std::cout, cin ou class, é C++. Se aparecer Console.WriteLine, é C#.

Copiei um código C++ para um arquivo .c e o gcc reclamou

A Ana achou um "Olá, mundo" na internet, salvou como cpp.c e compilou:

$ gcc -std=c23 -Wall -Wextra cpp.c -o cpp
cpp.c:1:10: fatal error: iostream: Arquivo ou diretório inexistente
    1 | #include <iostream>
      |          ^~~~~~~~~~
compilation terminated.

O que aconteceu: o código era C++. O <iostream> é um arquivo da biblioteca do C++, e o C não o conhece. A mensagem diz "erro fatal: iostream: arquivo ou diretório inexistente" (essa parte veio traduzida, porque é o sistema que a escreve). "Fatal" quer dizer que o compilador desistiu ali mesmo, sem nem olhar o resto, e "compilation terminated" é "compilação encerrada".

Como resolver: use material de C. Em C, o "Olá, mundo" usa #include <stdio.h> e printf, como na página Início.

Um programa C que não compila como C++

"Quase todo programa C também é C++", diz muita gente. Quase. A Ana guardou o número da turma numa variável chamada class ("turma", em inglês). Em C, funciona:

$ gcc -std=c23 -Wall -Wextra turma.c -o turma
$ ./turma
A Ana está na turma 3.
$ cp turma.c turma.cpp                                   « o mesmo código, como C++
$ g++ -std=c++23 -Wall -Wextra turma.cpp -o turma
turma.cpp: In function ‘int main()’:
turma.cpp:4:5: error: expected primary-expression before ‘int’
    4 |     int class = 3;
      |     ^~~
turma.cpp:5:41: error: expected primary-expression before ‘class’
    5 |     printf("A Ana está na turma %d.\n", class);
      |                                         ^~~~~

O que aconteceu: em C++, class é uma palavra reservada (serve para criar classes), então não pode ser nome de variável. Em C, é um nome como outro qualquer. O C e o C++ são parentes próximos, mas são linguagens diferentes, com regras diferentes.

Como resolver: código C vai em arquivos .c e é compilado com gcc; código C++ vai em .cpp e é compilado com g++. Não misture os dois sem saber o que está fazendo.

"Dei dois cliques no arquivo .c e só abriu um texto"

O que aconteceu: nada de errado. O arquivo .c é só o texto do programa, o "código-fonte". Ele não roda sozinho: primeiro precisa ser compilado. Quem roda é o executável gerado pelo compilador.

Como resolver: use as caixas Experimente do guia ou instale um compilador (aulas Instalar no Linux e Instalar no Windows e macOS).


O que você vai conseguir fazer

Ao terminar cada parte do guia, você vai saber:

Ao terminarVocê consegue
Nível 1 · InicianteEscrever, compilar e rodar programas que guardam valores, fazem contas, leem o que o usuário digita, tomam decisões, repetem tarefas, trabalham com listas (arrays) e textos, e se dividem em funções. Ler as mensagens de erro e os avisos do compilador.
Nível 2 · IntermediárioEntender a memória e os ponteiros, pedir e devolver memória com malloc e free, criar seus próprios tipos com struct e enum, ler e gravar arquivos, receber argumentos na linha de comando e organizar projetos com vários arquivos e um Makefile.
Nível 3 · AvançadoTrabalhar com bits, construir listas ligadas, pilhas, árvores e tabelas hash, entender o comportamento indefinido, usar as novidades do C23, criar processos e threads, e achar erros com o gdb, os sanitizers e o Valgrind.
ProjetosJuntar tudo: calculadora, jogo de adivinhação, boletim de notas, agenda de contatos, estoque da lojinha, contador de palavras e lista de tarefas.

Para fechar, rode o seu primeiro programa da aula:

Missão: o programa já escreve a primeira linha. Complete a segunda: troque ??? pelo seu nome e coloque um ! depois do C, para a saída ficar Meu nome é Ana e eu vou aprender C! (com o seu nome no lugar de Ana).

#include <stdio.h>

int main(void) {
    printf("Olá! Este é o meu primeiro programa em C.\n");
    printf("Meu nome é ??? e eu vou aprender C\n");
    return 0;
}
#include <stdio.h>

int main(void) {
    printf("Olá! Este é o meu primeiro programa em C.\n");
    printf("Meu nome é Ana e eu vou aprender C!\n");
    return 0;
}

O \n no fim de cada texto é a quebra de linha: ele faz a segunda frase começar numa linha nova. Tente apagar o primeiro \n e rodar: as duas frases ficam grudadas. A aula Novas Linhas e Escapes conta tudo sobre ele.


Exercícios

1. O que significa dizer que o C é uma linguagem compilada?

2. Quem criou o C, onde e para quê?

3. Qual destas afirmações é verdadeira?

4. Qual é um cuidado que o C exige e que o Python não exige?

5. A Ana encontrou um programa com #include <iostream> e std::cout. Em que linguagem ele está?

6. De onde vem o nome "C"?

7. A extensão certa

Para o gcc tratar o arquivo como código C, qual é a extensão do nome do arquivo? Complete:

ola

8. O livro clássico

O livro The C Programming Language, de Kernighan e Ritchie, é conhecido pelas iniciais dos autores. Complete (use o & no meio):

O livro foi publicado em 1978.

Resumo

  • Programar é escrever instruções para o computador; o processador só entende código de máquina, e alguém precisa traduzir.
  • O C é compilado: o compilador (no guia, o gcc) traduz tudo antes, e o executável roda sozinho, rápido.
  • Ele é rápido, pequeno e perto da máquina: você mexe direto na memória.
  • Criado por Dennis Ritchie no Bell Labs, em 1972, para escrever o Unix; o livro K&R é de 1978, o primeiro padrão (ANSI C) de 1989, e o guia ensina o C23.
  • Está no Linux e no Android, no Git, no interpretador do Python, no SQLite, em servidores e nos microcontroladores de aparelhos do dia a dia.
  • O preço da velocidade é a falta de proteção: erros de memória não são impedidos. O guia ensina desde o começo os hábitos e as ferramentas que pegam esses erros.
  • C, C++ e Python são linguagens diferentes: o C++ nasceu do C e é bem maior; o Python é mais fácil e mais lento, e roda em cima do C.
  • Próximo passo: ver o código virar programa, etapa por etapa, em Como o C Vira Programa.