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.
- 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\ne o;. - Compilar com
g++ ola.cpp -o olae 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 nomain. - 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 cozinha | Em C++ | Nesta aula |
|---|---|---|
| A receita no papel | O código-fonte: um arquivo de texto que você escreve | ola.cpp |
| A cozinheira que lê a receita e faz o bolo | O compilador | g++ |
| O bolo pronto | O programa executável, que o computador sabe rodar | ola |
| Comer o bolo | Rodar 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.cce.cxxem projetos de outras pessoas; o guia usa sempre.cpp. - Sem espaços e sem acentos no nome:
ola.cpp, e nãoolá 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.
iostreamvem de input/output stream, "fluxo de entrada e saída", e traz ostd::cout(saída na tela) e ostd::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:MainouMAINnão servem (a aula Sintaxe mostra o erro). - ()
- Os parênteses guardam o que a função recebe. Vazios = "esta
mainnã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
coutvem 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" chamadostd(um namespace, aula Namespaces). Os dois-pontos duplos::querem dizer "o que está dentro de":std::coutse lê "ocoutdostd".- <<
- 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.
{ 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
-ode 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.
É 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.
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:
| Forma | Onde aparece | Aula |
|---|---|---|
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++23 | O 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
| Escrita | O 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 |
\n | Quebra 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 ola | Compila ola.cpp e cria o programa ola |
g++ ola.cpp | Compila e cria o programa com o nome a.out |
./ola | Roda 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:
2. Compilar com nome
Complete o comando para compilar jogo.cpp e criar o programa jogo:
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 ostd::cout;int main() { … }é onde o programa começa;std::cout << "…";mostra texto;\nquebra 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 chamaa.out, e cada compilação sobrescreve o anterior. return 0;é opcional só namain. O código de saída aparece comecho $?.- Próximo passo: Compilar com g++, onde você aprende o comando completo que o guia usa daqui para a frente.