C++ Olá, Mundo

Chegou a hora de escrever o seu primeiro programa. Ele é pequeno: só mostra a frase Olá, mundo! na tela. Mas, para chegar até ela, você vai passar por todo o caminho que qualquer programa em C++ percorre: escrever o código num arquivo, compilar (transformar o texto em programa) e rodar. Nesta aula você entende cada pedacinho das cinco linhas do programa, sem pular nenhum símbolo.

Você vai aprender
  • Criar a pasta e o arquivo ola.cpp.
  • O que faz cada parte do Olá, mundo: #include <iostream>, int main(), { }, std::cout, <<, as aspas, o \n e o ;.
  • Compilar com g++ ola.cpp -o ola e rodar com ./ola.
  • Por que precisa do ./ na frente do nome.
  • O que é o arquivo a.out, que aparece quando você esquece o -o.
  • O que o return 0; faz e por que ele é opcional no main.
  • Os primeiros erros que todo mundo comete, com a mensagem real.

Todos os comandos desta aula foram executados na máquina fictícia da Ana (usuária ana, computador notebook), com o g++ 15.2 do Ubuntu 26.04, numa pasta chamada ~/cpp. As saídas foram copiadas da tela, sem mudar nada. Se você ainda não instalou o compilador, volte para Instalar no Linux (ou Windows e macOS). Se ainda não tem, você também pode fazer tudo no editor do guia, que roda C++ de verdade no navegador (O Editor do Guia).


A ideia: a receita e o bolo

Pense numa receita de bolo escrita num papel. O papel não é o bolo: alguém precisa ler a receita e fazer o bolo. Em C++ é igual:

Na cozinhaEm C++Nesta aula
A receita no papelO código-fonte: um arquivo de texto que você escreveola.cpp
A cozinheira que lê a receita e faz o boloO compiladorg++
O bolo prontoO programa executável, que o computador sabe rodarola
Comer o boloRodar o programa./ola

Depois que o bolo está pronto, você pode comê-lo sem a receita. E se mudar a receita, precisa fazer outro bolo. Guarde essa ideia: ela explica quase todos os tropeços do começo. O caminho completo, com pré-processador, compilador e ligador, está em Como o C++ Vira Programa; aqui você só precisa dos três passos: escrever, compilar, rodar.


1. Criar a pasta e o arquivo

Comece criando uma pasta só para os seus programas, para eles não se misturarem com fotos e documentos. No terminal:

$ mkdir cpp              « cria a pasta "cpp" dentro da sua pasta pessoal
$ cd cpp                 « entra nela

Os dois comandos não mostram nada quando dão certo: o terminal só volta a mostrar o prompt, agora com ~/cpp no fim. (mkdir e cd são comandos do terminal, não do C++. Eles são explicados no Guia Bash.)

Agora abra o seu editor de código (o VS Code, o Kate, o gedit ou o nano, veja Editores e IDEs), crie um arquivo novo, digite o programa abaixo e salve com o nome ola.cpp, dentro da pasta cpp:

#include <iostream>

int main() {
    std::cout << "Olá, mundo!\n";
}

Três cuidados ao salvar:

  • A extensão é .cpp (de "C plus plus"). Ela diz ao compilador e ao editor que o arquivo é C++. Você também vai ver .cc e .cxx em projetos de outras pessoas; o guia usa sempre .cpp.
  • Sem espaços e sem acentos no nome: ola.cpp, e não olá mundo.cpp. Funciona com espaços, mas você teria de usar aspas em todo comando.
  • Digite, não copie e cole, pelo menos desta vez. Digitar faz você reparar em cada símbolo, e os símbolos importam.

Para conferir que o arquivo está na pasta certa e com o conteúdo certo, use ls (lista os arquivos) e cat (mostra o conteúdo):

$ ls
ola.cpp
$ cat ola.cpp
#include <iostream>

int main() {
    std::cout << "Olá, mundo!\n";
}

2. O programa, linha por linha

São cinco linhas, e cada símbolo tem uma função. Leia com calma; não precisa decorar nada agora, porque você vai escrever essas linhas tantas vezes que elas vão grudar sozinhas.

Linha 1: #include <iostream>

O C++ "puro" sabe muito pouco: ele nem sabe mostrar texto na tela. Essa parte fica na biblioteca padrão, um conjunto enorme de ferramentas prontas que vem junto com o compilador e está dividida em arquivos chamados cabeçalhos (headers). A linha 1 pede: "antes de compilar, cole aqui o cabeçalho iostream".

#include
O # marca uma instrução para o pré-processador, um ajudante que prepara o arquivo antes do compilador. include = "incluir": copia o conteúdo de outro arquivo para dentro deste, naquele ponto. Linhas com # não terminam com ;. (O pré-processador tem aula própria: O Pré-processador.)
<iostream>
O nome do cabeçalho. iostream vem de input/output stream, "fluxo de entrada e saída", e traz o std::cout (saída na tela) e o std::cin (leitura do teclado, aula Entrada com cin). Os sinais < > funcionam como "parênteses pontudos": dizem "procure este arquivo nas pastas do sistema", onde fica a biblioteca padrão.

Linha 2: a linha em branco

Não faz nada. Ela só separa o "material que eu trouxe" do "programa", para ficar mais fácil de ler. O compilador ignora linhas em branco (mais sobre isso em Sintaxe).

Linha 3: int main() {

Aqui começa o programa de verdade. Todo programa em C++ tem uma função chamada main ("principal"). Uma função é um bloco de instruções com nome. Quando você roda o programa, o sistema procura a main e executa o que está dentro dela, de cima para baixo. Sem main, não existe programa.

int
De integer, "inteiro". Diz que a main, quando terminar, entrega um número inteiro ao sistema: o código de saída, que avisa se o programa deu certo. Você vai vê-lo na seção 6.
main
O nome da função. Tem de ser exatamente main, tudo em minúsculas: Main ou MAIN não servem (a aula Sintaxe mostra o erro).
()
Os parênteses guardam o que a função recebe. Vazios = "esta main não recebe nada". Em Funções você vai colocar coisas aí dentro.
{
A chave de abertura: "aqui começa o corpo da main". Tudo até a chave de fechamento } correspondente pertence a ela.

Linha 4: std::cout << "Olá, mundo!\n";

Esta é a única linha que faz alguma coisa: manda o texto para a tela. Ela tem recuo (quatro espaços no começo) porque está dentro da main. O recuo não é obrigatório, mas ajuda muito a ler.

std::cout
cout vem de character output, "saída de caracteres", e representa a tela (mais exatamente, a saída do terminal). Pronuncia-se "si-áut". std (de standard, "padrão") é o sobrenome de tudo o que vem da biblioteca padrão: os nomes dela moram num "bairro" chamado std (um namespace, aula Namespaces). Os dois-pontos duplos :: querem dizer "o que está dentro de": std::cout se lê "o cout do std".
<<
O operador de saída. Pense numa seta mostrando o caminho: o texto vai para dentro do cout. Dá para encadear vários: std::cout << "a" << "b" (aula Saída com cout).
"Olá, mundo!\n"
O texto, entre aspas duplas. As aspas dizem ao compilador "isto é texto para mostrar, não é código", e não aparecem na tela. Um texto entre aspas se chama string (aula Strings). No fim dele, o \n (barra invertida + n, de new line) é a quebra de linha: não aparece como "\n" na tela, faz o cursor pular para a linha de baixo. Sem ele, o prompt do terminal gruda no seu texto (aula Novas Linhas).
;
O ponto e vírgula termina a instrução, como o ponto final de uma frase. Esquecê-lo é o erro número um de quem começa, e você vai vê-lo no fim desta aula.

Linha 5: }

A chave de fechamento: "acabou a main". Quando o programa chega aqui, ele termina. Toda { precisa de uma }, como parênteses numa conta.

Teclas difíceis no teclado brasileiro (ABNT2)

{ e }: AltGr + 7 e AltGr + 0, ou a tecla ao lado do P/Ç com Shift. < e >: a tecla ao lado do Z (com e sem Shift) ou Shift + vírgula/ponto. \: a tecla ao lado do Z no teclado ABNT2 ou acima do Enter no padrão americano. #: Shift + 3.


3. Compilar: de texto para programa

O arquivo ola.cpp é só texto. O computador não sabe rodá-lo. Quem transforma o texto em programa é o compilador g++ (o compilador de C++ do projeto GNU):

$ g++ ola.cpp -o ola
$                        « nada! no mundo dos compiladores, silêncio = deu certo

O g++ não diz "pronto" nem "sucesso". Se ele não reclamou, compilou. Repare que agora há um arquivo novo na pasta:

$ ls
ola  ola.cpp             « "ola" é o programa (no terminal, ele aparece em verde: é executável)
g++
O compilador.
ola.cpp
O arquivo de código que ele vai ler (a receita).
-o ola
-o de output, "saída": o nome do programa que ele vai criar (o bolo). Pode ser qualquer nome; usar o mesmo nome do arquivo, sem o .cpp, é o costume.

Este é o comando mínimo. Na próxima aula, Compilar com g++, você vai acrescentar opções que ativam o C++ moderno e fazem o compilador avisar sobre erros prováveis, e a partir dela o guia usa sempre o comando completo: g++ -std=c++23 -Wall -Wextra ola.cpp -o ola.


4. Rodar o programa

Para rodar um programa que está na pasta atual, escreva ./ e o nome dele:

$ ./ola
Olá, mundo!

Pronto: esse é o seu primeiro programa em C++ funcionando. As aspas não apareceram, o \n virou uma quebra de linha e o prompt voltou na linha de baixo, como deveria.

Por que ./?

Quando você digita um nome solto, como ls ou g++, o terminal procura o programa numa lista fixa de pastas do sistema (a variável PATH). A sua pasta ~/cpp não está nessa lista, por segurança. O . quer dizer "a pasta onde estou agora" e a / separa a pasta do arquivo. Então ./ola é "o programa ola que está aqui". Sem o ./:

$ ola
bash: ola: comando não encontrado

O terminal procurou um comando ola nas pastas do sistema e não achou. Não é um erro do C++: o programa está lá, só faltou dizer onde.

Agora é a sua vez. O editor abaixo compila e roda C++ de verdade no navegador (a primeira vez demora alguns segundos, porque ele baixa o compilador). Ele faz os passos 3 e 4 de uma vez quando você clica em Rodar.

Missão: rode o programa como está. Depois troque mundo pelo nome Ana, de modo que a saída seja Olá, Ana!, e rode de novo. Mexa só no que está entre as aspas.

#include <iostream>

int main() {
    std::cout << "Olá, mundo!\n";
}
#include <iostream>

int main() {
    std::cout << "Olá, Ana!\n";
}

5. Sem o -o: o famoso a.out

O -o ola é opcional. Se você não disser o nome do programa, o g++ escolhe um sozinho: a.out.

$ g++ ola.cpp
$ ls
a.out  ola  ola.cpp      « apareceu o a.out
$ ./a.out
Olá, mundo!

O a.out é um programa igualzinho ao ola, só com outro nome. Os dois têm até o mesmo tamanho:

$ ls -l
total 36
-rwxrwxr-x 1 ana ana 16120 out 16 21:40 a.out
-rwxrwxr-x 1 ana ana 16120 out 16 21:40 ola
-rw-rw-r-- 1 ana ana    71 out 16 21:40 ola.cpp

Repare nos tamanhos: as 5 linhas de texto ocupam 71 bytes; o programa pronto, 16120 bytes (cerca de 16 KB). Ele contém o código traduzido para a linguagem do processador e as informações que o sistema precisa para carregá-lo. E o x em -rwxrwxr-x quer dizer "executável": o g++ já cria o programa com permissão para rodar.

Por que "a.out"?

É um nome histórico, dos primeiros sistemas Unix dos anos 1970: assembler output, "saída do montador". O nome ficou até hoje. O problema do a.out é que cada compilação sem -o sobrescreve o anterior: se você compilar dois programas diferentes sem -o, só o último sobra. Por isso, o guia sempre usa -o nome.


6. O return 0; e o código de saída

Em muitos livros e sites, o Olá, mundo tem uma linha a mais:

#include <iostream>

int main() {
    std::cout << "Olá, mundo!\n";
    return 0;
}
return
"Devolver". Termina a função e entrega um valor para quem a chamou. No caso da main, quem chamou foi o sistema operacional.
0
O valor entregue: o código de saída. Por convenção, 0 = "terminei sem problemas"; qualquer outro número = "algo deu errado" (cada programa escolhe o que cada número significa).
;
Como toda instrução, termina com ponto e vírgula.

No terminal, o código de saída do último programa fica guardado em $?. Veja com echo:

$ ./ola
Olá, mundo!
$ echo $?
0

Deu 0, mesmo sem o return 0; no nosso ola.cpp. Isso porque a main tem uma regra especial: se ela chegar ao } final sem return, o C++ age como se lá estivesse return 0;. Só a main tem essa regra; nas outras funções, esquecer o return é um problema sério (aula Retorno).

Para ver que o número chega mesmo ao sistema, devolva outro valor:

#include <iostream>

int main() {
    std::cout << "Saindo com 3\n";
    return 3;
}
$ g++ saida3.cpp -o saida3
$ ./saida3
Saindo com 3
$ echo $?
3                        « o 3 do return chegou ao terminal

Para que serve isso? Scripts e outros programas usam o código de saída para saber se o seu programa deu certo. O próprio g++ faz isso: quando a compilação falha, ele sai com o código 1.

Com ou sem return 0;?

Os dois estão certos. Este guia omite o return 0; na main quando o programa sempre termina bem, para os exemplos ficarem mais curtos, e usa return quando o valor importa. Em código de outras pessoas, você vai ver as duas formas. O editor do guia mostra o código de saída embaixo da saída do programa.


7. Mostrar mais de uma linha

A main pode ter quantas instruções você quiser. Elas rodam uma depois da outra, de cima para baixo, cada uma terminada com ;:

#include <iostream>

int main() {
    std::cout << "Olá! Eu sou a Ana.\n";
    std::cout << "Estou aprendendo C++.\n";
    std::cout << "Este é o meu primeiro programa.\n";
}
$ g++ apresentacao.cpp -o apresentacao
$ ./apresentacao
Olá! Eu sou a Ana.
Estou aprendendo C++.
Este é o meu primeiro programa.

Cada \n fecha uma linha. O que acontece se tirar um deles, e outras formas de quebrar linha, estão em Novas Linhas. Juntar texto e números numa mesma instrução (<< "Idade: " << 29) está em Saída com cout.

Outras formas de escrever o Olá, mundo

Você vai encontrar o mesmo programa escrito de jeitos diferentes. Todos funcionam:

FormaOnde apareceAula
std::cout << "Olá, mundo!\n";A forma deste guia nas primeiras aulas. Funciona em qualquer versão do C++.Esta
std::cout << "Olá, mundo!" << std::endl;Muito comum em livros e cursos. O std::endl quebra a linha e "despeja" a saída na hora.Novas Linhas
using namespace std; + cout << …Sites de exercícios e código antigo. Evita escrever std::, com riscos.Sintaxe
#include <print> + std::println("Olá, mundo!"); C++23O jeito mais novo. Precisa compilar com -std=c++23.Compilar e std::print

Qual usar? Por enquanto, a primeira. O std::cout aparece em praticamente todo código C++ que existe, então você precisa conhecê-lo bem. O std::println chega mais tarde no guia, quando você já souber formatar valores.


Quando dá errado

Errar faz parte. Um erro de compilação não estraga nada: o g++ só se recusa a criar o programa até você consertar. Estes são os tropeços mais comuns da primeira vez.

bash: ola: comando não encontrado
$ ola
bash: ola: comando não encontrado

O que significa: faltou o ./. O terminal procurou ola nas pastas do sistema.

Como consertar: ./ola.

bash: ./ola: Arquivo ou diretório inexistente
$ ./ola
bash: ./ola: Arquivo ou diretório inexistente

O que significa: não existe nenhum programa ola nesta pasta. Ou você ainda não compilou, ou a compilação falhou (e, quando falha, o g++ não cria o programa), ou você está em outra pasta.

Como consertar: rode ls para ver o que há na pasta. Se o ola.cpp está lá, compile (g++ ola.cpp -o ola) e leia se apareceu algum erro. Se nem o ola.cpp aparece, entre na pasta certa com cd ~/cpp.

fatal error: ole.cpp: Arquivo ou diretório inexistente
$ g++ ole.cpp -o ola
cc1plus: fatal error: ole.cpp: Arquivo ou diretório inexistente
compilation terminated.

O que significa: o nome do arquivo de código está errado (aqui, ole em vez de ola), ou ele foi salvo em outra pasta, ou com outra extensão (ola.cpp.txt, ola.txt). Fatal error = "erro fatal"; compilation terminated = "compilação encerrada". O cc1plus é a parte do g++ que compila C++ de fato.

Como consertar: ls e confira o nome exato. A tecla Tab completa nomes de arquivo no terminal e evita esse erro.

input file ‘ola.cpp’ is the same as output file
$ g++ ola.cpp -o ola.cpp
g++: fatal error: input file ‘ola.cpp’ is the same as output file
compilation terminated.

O que significa: "o arquivo de entrada é o mesmo que o de saída". Você pediu para o programa se chamar ola.cpp, o que apagaria o seu código. O g++ 15 se recusa, e isso salvou o seu arquivo.

Como consertar: o nome depois do -o é o do programa, sem .cpp: g++ ola.cpp -o ola.

error: expected ‘;’ before ‘}’ token
#include <iostream>

int main() {
    std::cout << "Olá, mundo!\n"
}
$ g++ semponto.cpp -o semponto
semponto.cpp: In function ‘int main()’:
semponto.cpp:4:33: error: expected ‘;’ before ‘}’ token
    4 |     std::cout << "Olá, mundo!\n"
      |                                 ^
      |                                 ;
    5 | }
      | ~                                

O que significa: "esperava ; antes do }". Faltou o ponto e vírgula no fim da linha 4. A mensagem diz o arquivo (semponto.cpp), a linha (4) e a coluna (33), e o g++ até desenha o ; no lugar onde ele deveria estar.

Como consertar: coloque o ; no fim da linha 4 e compile de novo. Ler mensagens assim, com calma, é o assunto da aula Lendo Erros do Compilador.

undefined reference to `main' (ou, em português, referência não definida para "main")
$ cat semmain.cpp
#include <iostream>
$ g++ semmain.cpp -o semmain
/usr/bin/x86_64-linux-gnu-ld.bfd: /usr/lib/gcc/x86_64-linux-gnu/15/../../../x86_64-linux-gnu/Scrt1.o: na função "_start":
(.text+0x1b): referência não definida para "main"
collect2: error: ld returned 1 exit status

O que significa: o arquivo não tem a função main (ou ela foi escrita com outro nome, como Main). Quem reclama aqui não é o compilador, é o ligador (ld, de linker), a última etapa, que monta o programa e precisa saber onde ele começa. Repare que essa parte da mensagem saiu em português: o ligador do Ubuntu tem tradução, o g++ não. Em inglês ela diz undefined reference to `main'.

Como consertar: confira se existe int main() { … }, escrito exatamente assim.


Referência rápida

EscritaO que faz
#include <iostream>Traz o std::cout (e o std::cin) da biblioteca padrão
int main() { … }A função principal: o programa começa e termina nela
std::cout << "texto";Mostra o texto na tela
\nQuebra de linha, dentro das aspas
;Termina uma instrução
return 0;Termina a main com código de saída 0 (opcional só na main)
g++ ola.cpp -o olaCompila ola.cpp e cria o programa ola
g++ ola.cppCompila e cria o programa com o nome a.out
./olaRoda o programa ola da pasta atual
echo $?Mostra o código de saída do último programa

Exercícios

1. O cabeçalho

Complete a primeira linha para poder usar o std::cout:

#include <>

2. Compilar com nome

Complete o comando para compilar jogo.cpp e criar o programa jogo:

g++ jogo.cpp

3. Rodar

O programa jogo está na pasta atual. Que comando o roda?

$

4. Você compilou com g++ teste.cpp, sem -o. Como se chama o programa criado?

5. Qual destas afirmações sobre o return 0; está certa?

6. O que o \n faz em "Olá, mundo!\n"?

Missão final: o cartão de visita

Missão: escreva um programa completo, do #include à }, que mostre o cartão de visita da Ana em três linhas:

Ana Souza
Programadora C++
Recife - PE

Use um std::cout para cada linha. Se o compilador reclamar, leia a linha e a coluna da mensagem.

// escreva o programa inteiro aqui

#include <iostream>

int main() {
    std::cout << "Ana Souza\n";
    std::cout << "Programadora C++\n";
    std::cout << "Recife - PE\n";
}

Resumo

  • Programar em C++ tem três passos: escrever o código (ola.cpp), compilar (g++ ola.cpp -o ola) e rodar (./ola).
  • #include <iostream> traz o std::cout; int main() { … } é onde o programa começa; std::cout << "…"; mostra texto; \n quebra a linha; ; termina a instrução.
  • O g++ não diz nada quando dá certo. Silêncio = compilou.
  • Programas da pasta atual rodam com ./ na frente.
  • Sem -o, o programa se chama a.out, e cada compilação sobrescreve o anterior.
  • return 0; é opcional só na main. O código de saída aparece com echo $?.
  • Próximo passo: Compilar com g++, onde você aprende o comando completo que o guia usa daqui para a frente.