C++ O Editor do Guia
Em toda aula há caixas Experimente: um pequeno editor de código com um botão Rodar. Elas não são uma imitação: cada clique compila de verdade o seu código, com o compilador Clang funcionando dentro do navegador, e roda o programa gerado. Nesta aula você vai conhecer cada parte da caixa, entender o que aparece no terminal dela, aprender a digitar a entrada do programa, usar as abas e as missões, e saber em que o editor é diferente do compilador instalado no seu computador.
- As partes da caixa: abas, editor, Argumentos, Rodar, terminal, Restaurar e Ver solução.
- O que acontece na primeira vez que você clica em Rodar (o download do compilador).
- Como ler erros e avisos de compilação na caixa.
- Como o programa recebe o que você digita (
std::cin), os argumentos e os arquivos das abas. - Como funcionam as missões.
- A mesma falha no Clang do editor e no g++ do terminal, lado a lado.
- O que funciona igual e o que é diferente no editor e no seu computador.
A ideia: um laboratório portátil
Na escola, o laboratório de ciências tem tudo pronto: você chega, faz o experimento e vai embora. O editor do guia é assim. O compilador fica guardado dentro da página, e o programa roda num "computador de mentirinha" que só existe enquanto a aba está aberta, com uma pasta da Ana (/home/ana). Nada do que você fizer ali toca no seu computador. Se algo der muito errado, recarregue a página.
Por baixo, é o Clang 22, do projeto LLVM, o mesmo compilador que você instalaria no seu computador, só que transformado em WebAssembly (um formato de programa que os navegadores executam quase tão rápido quanto um programa comum). Ele faz as quatro etapas que você viu em Como o C++ Vira Programa: pré-processar, compilar, montar e ligar. O resultado é um programa WebAssembly, que o navegador roda em seguida.
As partes da caixa
Rode esta caixa e acompanhe a explicação abaixo dela:
#include <iostream>
int main() {
std::cout << "Olá, mundo!\n";
std::cout << "2 + 3 = " << 2 + 3 << "\n";
}
- Aba
- O nome do arquivo que você está editando, como
programa.cpp. Algumas caixas têm várias abas (veja Várias abas). - Restaurar
- Volta ao código original da aula, apagando as suas mudanças. Use sem medo: o original nunca se perde.
- Editor
- Clique e digite. Os números à esquerda são os números das linhas, os mesmos que as mensagens de erro citam.
- Argumentos
- Palavras que o programa recebe ao ser chamado, como no terminal (veja Argumentos). Quase sempre fica vazio.
- ▶ Rodar
- Compila e roda. Enquanto o programa roda, o botão vira ■ Parar.
- Terminal
- Aparece depois de rodar, com o título
Terminal — ana@notebook: ~: o comando de compilação, as mensagens do compilador, o comando que roda o programa, a saída e o código de saída.
Depois de rodar, o terminal da caixa mostra:
$ clang++ -std=c++23 -Wall -Wextra programa.cpp -o programa $ ./programa Olá, mundo! 2 + 3 = 5 [código de saída: 0]
São exatamente os passos que você faria no terminal: compilar com o clang++ (com as mesmas opções que o guia usa com o g++: -std=c++23 -Wall -Wextra) e rodar com ./programa. Enquanto compila, aparece (compilando…). O [código de saída: 0] é o número que o programa devolve ao terminar: 0 quer dizer "terminou bem". No terminal de verdade, ele fica escondido, e você o vê com echo $?; o editor mostra sempre.
A primeira vez: o download do compilador
Na primeira vez que você clica em Rodar, o navegador baixa o compilador e a biblioteca padrão do C++: cerca de 33 MB. Aparece uma barra com a mensagem Baixando o compilador C++ (≈ 33 MB, só na primeira vez)… e a porcentagem, depois Preparando o compilador…. Leva de alguns segundos a um minuto, conforme a internet. Depois disso:
- o navegador guarda tudo: nas outras caixas, nas outras aulas e nas próximas visitas não há download;
- cada compilação leva menos de um segundo para programas que começam com
#include <iostream>ou#include <print>(esses cabeçalhos vêm "pré-compilados"), e de 2 a 5 segundos para os outros; - se a internet cair no meio do download, aparece
Não consegui carregar o compilador: …seguido de "Confira a internet e clique em Rodar de novo".
Se você usa o celular com plano de dados, prefira o Wi-Fi na primeira vez. E repare na comparação: um compilador C++ instalado no computador ocupa centenas de megabytes; o do guia cabe em 33.
Atalhos do editor
| Tecla | O que faz |
|---|---|
| Ctrl+Enter (Mac: Cmd+Enter) | Roda o código, sem tirar a mão do teclado. |
| Tab | Insere o recuo (4 espaços). Com várias linhas selecionadas, recua todas. |
| Shift+Tab | Tira um nível de recuo. |
| Enter | Pula a linha mantendo o recuo; depois de {, ( ou [, recua mais um nível. Um } sozinho na linha volta um nível. |
| Esc | Sai do editor (para quem navega pelo teclado: depois, Tab vai para o próximo botão). |
Erros e avisos de compilação
Quando o compilador reclama, as mensagens aparecem no terminal da caixa, coloridas como num terminal de verdade, e o programa não roda (não existe programa para rodar). A caixa abaixo tem um erro:
Missão: rode e leia a mensagem: ela diz a linha e a coluna do problema e até mostra o que falta. Conserte e rode de novo.
#include <iostream>
int main() {
std::cout << "Olá, mundo!\n"
}
#include <iostream>
int main() {
std::cout << "Olá, mundo!\n";
}
$ clang++ -std=c++23 -Wall -Wextra programa.cpp -o programa
programa.cpp:4:34: error: expected ';' after expression
4 | std::cout << "Olá, mundo!\n"
| ^
| ;
1 error generated.
[código de saída: 1]
A mensagem diz: no arquivo programa.cpp, linha 4, coluna 34, um error ("erro"): expected ';' after expression, "esperava ; depois da expressão". A setinha ^ aponta o lugar, e a linha de baixo mostra o ; que falta. O 1 error generated. conta os erros, e o [código de saída: 1] é o do compilador: deu errado, nada foi rodado. A aula Lendo Erros do Compilador ensina a ler essas mensagens.
Avisos (warning) são diferentes: o programa compila e roda, mas o compilador desconfia de algo. Os dois aparecem no terminal, um antes do outro:
$ clang++ -std=c++23 -Wall -Wextra programa.cpp -o programa
programa.cpp:4:9: warning: unused variable 'idade' [-Wunused-variable]
4 | int idade = 29;
| ^~~~~
1 warning generated.
$ ./programa
Olá!
[código de saída: 0]
A variável idade foi criada e nunca usada: não é erro, mas costuma ser esquecimento. A aula Avisos mostra os mais comuns.
A entrada: o programa pergunta, você responde
Quando um programa lê o teclado com std::cin (aula Entrada com cin), a caixa pausa o programa e mostra um campo para você digitar, dentro do próprio terminal, logo depois da pergunta. Digite e tecle Enter. Rode e experimente:
#include <iostream>
#include <string>
int main() {
std::string nome;
std::cout << "Qual é o seu nome? ";
std::cin >> nome;
std::cout << "Olá, " << nome << "!\n";
}
| No campo de entrada | O que faz |
|---|---|
| Enter | Envia a linha digitada para o programa. |
| Ctrl+D | Avisa "acabou a entrada" (fim de arquivo), como no terminal do Linux. |
| Ctrl+C ou ■ Parar | Para o programa. O terminal mostra ^C e o código de saída 130, o mesmo que o Linux usa para "interrompido". |
Algumas caixas já trazem a entrada pronta, num campo Entrada ao lado do botão Rodar: o que estiver ali é entregue ao programa, uma linha de cada vez, como se alguém digitasse. No terminal da caixa, cada linha aparece no ponto em que o programa a lê. Você pode mudar o texto do campo antes de rodar.
Missão: o programa lê o nome, mas ainda não lê a idade (a segunda linha da Entrada). Acrescente int idade = 0;, leia com std::cin >> idade; e troque a última linha para mostrar Ana tem 29 anos. usando as duas variáveis.
#include <iostream>
#include <string>
int main() {
std::string nome;
std::cout << "Nome: ";
std::cin >> nome;
std::cout << "Olá, " << nome << "!\n";
}
#include <iostream>
#include <string>
int main() {
std::string nome;
int idade = 0;
std::cout << "Nome: ";
std::cin >> nome;
std::cout << "Idade: ";
std::cin >> idade;
std::cout << nome << " tem " << idade << " anos.\n";
}
No terminal da Ana, a mesma ideia: quando o programa espera, o que ela digita aparece na tela (é o terminal que "ecoa" as teclas). Se a entrada vier de outro programa, pelo | (aula Entrada com cin), nada é ecoado, e a resposta sai grudada na pergunta:
$ echo Ana | ./nome Qual é o seu nome? Olá, Ana! « o "Ana" veio pelo |, sem eco
Argumentos
O campo Argumentos faz o papel das palavras que vêm depois do nome do programa no terminal: ./programa maçã 'pera uva'. Aspas juntam palavras num argumento só, como no bash. O programa os recebe no argv (aula Funções e, em detalhe, nos projetos):
#include <iostream>
int main(int argc, char* argv[]) {
for (int i = 0; i < argc; i++) {
std::cout << i << ": " << argv[i] << "\n";
}
}
$ clang++ -std=c++23 -Wall -Wextra programa.cpp -o programa $ ./programa 'maçã' 'pera uva' 0: ./programa 1: maçã 2: pera uva [código de saída: 0]
O argv[0] é sempre o próprio nome do programa. Na linha do comando, o editor põe aspas em volta de maçã por precaução (por causa das letras acentuadas); o programa recebe a palavra sem as aspas. Troque o texto do campo e rode de novo.
Várias abas: vários arquivos
Algumas caixas têm mais de uma aba. Cada aba é um arquivo da mesma pasta:
- todos os arquivos
.cppsão compilados juntos num programa só (aula Compilar Vários Arquivos); - os outros (
.h,.txt,.csv) ficam na pasta em que o programa roda,/home/ana, e o programa pode abri-los; - arquivos que o programa cria (com
std::ofstream) vivem numa pasta na memória, que começa limpa a cada Rodar.
#include <fstream>
#include <iostream>
#include <string>
int main() {
std::ifstream arquivo("lista.txt");
std::string item;
int n = 0;
while (std::getline(arquivo, item)) {
n = n + 1;
std::cout << n << ". " << item << "\n";
}
}
arroz feijão café
O programa abre o lista.txt da outra aba e numera as linhas (a aula Ler e Escrever Arquivos explica cada linha). Clique na aba lista.txt, acrescente leite numa linha nova e rode outra vez. Repare também no comando de compilação: o executável se chama compras, o nome do primeiro .cpp sem a extensão.
Missões, Restaurar e Ver solução
Muitas caixas têm uma missão: um desafio escrito acima do editor. Embaixo da caixa aparece Missão em andamento…; a cada Rodar, o editor confere se o desafio foi cumprido e, quando foi, mostra ✔ Missão cumprida!. Se faltar alguma coisa, a mensagem dá uma pista entre parênteses, como (o código ainda não compila) ou (a saída ainda não é a esperada).
O editor confere o resultado, não o jeito: se a missão pede que apareça Olá, Ana!, qualquer código que mostre isso vale. Algumas missões pedem também um recurso (por exemplo, "use std::println") ou um erro de propósito, para você ver a mensagem. Como esta:
Missão: provoque o erro do ;: apague o ponto e vírgula do fim da linha 4 e rode. A missão se cumpre quando a compilação falha com a mensagem expected ';'.
#include <iostream>
int main() {
std::cout << "Vou dar erro de propósito\n";
}
#include <iostream>
int main() {
std::cout << "Vou dar erro de propósito\n"
}
| Botão | O que faz |
|---|---|
| Restaurar | Volta ao código original da caixa. Útil quando você mexeu demais e se perdeu. |
| Ver solução | Só nas missões. Pergunta Trocar o seu código pela solução?; com Sim, mostrar, o editor troca o código pelo de uma solução possível (com Cancelar, nada muda). Depois, Restaurar volta ao início. |
Errar faz parte: cada mensagem do compilador que você lê e entende é uma lição. Tente pelo menos duas ou três vezes antes de clicar em Ver solução. E, depois de ver, clique em Restaurar e faça de novo sozinho.
Parar um programa
Um programa que não termina nunca (um "laço infinito", que você vai conhecer em while) não trava a página: ele roda separado. Clique em ■ Parar: aparece ^C e o código de saída 130. Se você não parar, o editor para sozinho depois de 15 segundos, com a mensagem (o editor parou o programa: ele rodou mais de 15 segundos sem terminar — laço infinito?). O tempo em que o programa espera você digitar não conta. E um programa que escreve demais (mais de 2 MB de texto) também é interrompido.
Clang no editor × g++ no terminal
As caixas usam o Clang; os terminais das aulas mostram o g++. Os dois seguem o mesmo padrão C++23, então um programa correto dá o mesmo resultado nos dois. A diferença aparece quando algo dá errado: cada compilador escreve as mensagens com as suas palavras. Debaixo de toda caixa há uma nota lembrando disso. Veja as mesmas falhas nos dois compiladores, todas reais (o Clang da Ana, versão 21, dá as mesmas mensagens que o Clang 22 do editor).
1. Faltou o ;
$ g++ -std=c++23 -Wall -Wextra erro.cpp -o erro
erro.cpp: In function ‘int main()’:
erro.cpp:4:33: error: expected ‘;’ before ‘}’ token
4 | std::cout << "Olá, mundo!\n"
| ^
| ;
5 | }
| ~
$ clang++ -std=c++23 -Wall -Wextra erro.cpp -o erro
erro.cpp:4:34: error: expected ';' after expression
4 | std::cout << "Olá, mundo!\n"
| ^
| ;
1 error generated.
O g++ diz "esperava ; antes do }"; o Clang, "esperava ; depois da expressão". Mesmo diagnóstico, mesmo conserto. Repare em três diferenças de estilo:
- o g++ começa dizendo em que função está (
In function ‘int main()’); - o g++ usa aspas curvas (
‘;’), o Clang aspas retas (';'); - a coluna: 33 no g++ e 34 no Clang. O Clang conta bytes, e o
áde "Olá" ocupa dois bytes em UTF-8; o g++ conta caracteres. Numa linha sem acentos, os dois dão o mesmo número.
2. Um nome que não existe
$ g++ -std=c++23 -Wall -Wextra total.cpp -o total
total.cpp: In function ‘int main()’:
total.cpp:5:39: error: ‘quantidade’ was not declared in this scope
5 | std::cout << "Total: " << preco * quantidade << "\n";
| ^~~~~~~~~~
$ clang++ -std=c++23 -Wall -Wextra total.cpp -o total
total.cpp:5:39: error: use of undeclared identifier 'quantidade'
5 | std::cout << "Total: " << preco * quantidade << "\n";
| ^~~~~~~~~~
1 error generated.
g++: "quantidade não foi declarada neste escopo". Clang: "uso de identificador não declarado quantidade". As duas querem dizer: você usou um nome que o programa não conhece (esqueceu de criar a variável, ou escreveu o nome diferente). Essa dupla de frases vai aparecer muito no guia.
3. Aspas sem fechar: 391 linhas × 5
$ g++ -std=c++23 -Wall -Wextra aspas.cpp -o aspas 2>&1 | wc -l
391 « o g++ se perde e escreve 391 linhas
$ clang++ -std=c++23 -Wall -Wextra aspas.cpp -o aspas
aspas.cpp:4:18: warning: missing terminating '"' character [-Winvalid-pp-token]
4 | std::cout << "Olá, mundo!\n;
| ^
aspas.cpp:4:18: error: expected expression
1 warning and 1 error generated.
Aqui a diferença é grande: depois de dizer missing terminating " character nas primeiras linhas, o g++ tenta entender o resto e despeja centenas de linhas de consequências (a aula Editores e IDEs mostra o começo). O Clang para logo. Nos dois, a lição é a mesma: a primeira mensagem é a que importa.
4. Erro do ligador
$ g++ -std=c++23 -Wall -Wextra soma.cpp -o soma /usr/bin/x86_64-linux-gnu-ld.bfd: /tmp/cct8z3bi.o: na função "main": soma.cpp:(.text+0x13): referência não definida para "soma(int, int)" collect2: error: ld returned 1 exit status
$ clang++ -std=c++23 -Wall -Wextra programa.cpp -o programa wasm-ld: error: /tmp/programa-62bf3f.o: undefined symbol: soma(int, int) clang++: error: linker command failed with exit code 1 (use -v to see invocation) [código de saída: 1]
A função soma foi declarada e nunca escrita (veja Como o C++ Vira Programa). No Linux, o ligador é o ld, e a mensagem sai em português ("referência não definida"); no editor, o ligador é o wasm-ld (o ligador de WebAssembly), em inglês ("símbolo não definido"). Mesmo problema, mesma solução: escrever a função.
| Situação | g++ (terminais das aulas) | Clang (editor) |
|---|---|---|
Faltou ; | expected ‘;’ before ‘}’ token | expected ';' after expression |
| Nome desconhecido | ‘x’ was not declared in this scope | use of undeclared identifier 'x' |
| Aspas sem fechar | missing terminating " character + centenas de linhas | missing terminating '"' character + expected expression |
| Variável não usada | unused variable ‘x’ [-Wunused-variable] | unused variable 'x' [-Wunused-variable] |
| Função sem corpo | referência não definida para (do ld) | undefined symbol: (do wasm-ld) |
| Contagem no fim | (não tem) | 1 error generated. |
Quando uma mensagem de um não fizer sentido, compare com a do outro: muitas vezes uma explica melhor que a outra.
O que funciona no editor
- Todo o C++23 que o guia ensina:
std::cout,std::print/std::println,std::format,std::string,std::vectore os outros contêineres, ranges, lambdas, classes, templates, concepts, ponteiros inteligentes. - Exceções (
try,catch,throw). - Entrada (
std::cin,std::getline), argumentos, arquivos das abas e arquivos criados pelo programa. - Números aleatórios,
<chrono>,std::this_thread::sleep_for. - Outras versões do C++, quando a caixa pede (aula Versões do C++ tem uma caixa em C++20).
O que não funciona (só no seu computador)
- Threads:
std::threadcompila, mas, ao criar a thread, o programa termina comthread constructor failed: Not supported. A aula Threads usa o terminal. system()(rodar um comando do sistema) e rede: não há sistema nem rede dentro do navegador.import std;: use#include(aula Módulos).- Depurador e sanitizers (
gdb,-fsanitize): as aulas Depurar com o GDB e Sanitizers usam o terminal. - Fuso horário: o relógio do editor está em UTC (horário de Greenwich), 3 horas à frente de Brasília.
- Limites: 15 segundos rodando, 2 MB de saída, 256 MB de memória.
O que é diferente no editor × no seu computador
O editor gera um programa WebAssembly de 32 bits e usa a biblioteca padrão do LLVM (a libc++). O g++ do Linux gera um programa x86-64 de 64 bits e usa a biblioteca do GCC (a libstdc++). Para programas corretos, isso quase nunca muda nada. Mas, quando o programa faz algo errado ou depende do tamanho dos tipos, as diferenças aparecem. Todas as linhas abaixo foram conferidas: no editor, com a ferramenta do guia que roda o mesmo compilador fora do navegador; no computador, com o g++ 15 da Ana.
| Situação | Editor (Clang 22 + libc++) | g++ 15 no Linux (libstdc++) |
|---|---|---|
| Exceção que ninguém trata | libc++abi: terminating due to uncaught exception of type std::runtime_error: deu ruim, Abortado (imagem do núcleo gravada), código 134 | terminate called after throwing an instance of 'std::runtime_error' / what(): deu ruim, Abortado, código 134 |
Usar um ponteiro nulo (*p com p = nullptr) | Falha de segmentação (imagem do núcleo gravada), código 139 | Falha de segmentação, código 139 (igual) |
| Divisão inteira por zero | Exceção de ponto flutuante (imagem do núcleo gravada), código 136 | Exceção de ponto flutuante, código 136 (igual) |
v[10] num vetor de 3 elementos | passa em silêncio: mostrou 0 e o programa continuou | no Ubuntu, o g++ vem com conferências ligadas: Assertion '__n < this->size()' failed., código 134 |
delete duas vezes no mesmo ponteiro | passa em silêncio, código 0 | free(): double free detected in tcache 2, Abortado, código 134 |
sizeof(long) e sizeof de um ponteiro | 4 e 4 (32 bits) | 8 e 8 (64 bits) |
sizeof(int) e sizeof(long long) | 4 e 8 | 4 e 8 (igual) |
std::system("ls") | sh: 1: ls: not found | roda o ls |
std::thread | thread constructor failed: Not supported, Abortado | funciona |
| Erro de ligação | wasm-ld: error: …: undefined symbol: soma(int, int) | referência não definida para "soma(int, int)" |
A lição mais importante está nas linhas do v[10] e do delete duplo: um erro que "passa em silêncio" continua sendo um erro. Em C++, acessar fora do vetor ou liberar a memória duas vezes é comportamento indefinido: o programa pode travar, pode mostrar lixo, pode até parecer funcionar, e o resultado muda de um computador para outro. O editor e o g++ fizeram coisas diferentes justamente por isso. A aula Comportamento Indefinido trata do assunto, e as aulas Sanitizers e Depurar com o GDB mostram as ferramentas que caçam esses erros no seu computador.
Confira o tamanho dos tipos no editor. No terminal da Ana, o mesmo programa mostra int: 4, long: 8, long long: 8 e ponteiro: 8:
#include <iostream>
int main() {
std::cout << "int: " << sizeof(int) << "\n";
std::cout << "long: " << sizeof(long) << "\n";
std::cout << "long long: " << sizeof(long long) << "\n";
std::cout << "ponteiro: " << sizeof(int*) << "\n";
}
Por isso o guia prefere int e long long, que têm o mesmo tamanho nos dois, e explica os tamanhos na aula Inteiros.
No terminal da Ana, os programas que "quebram" mostram estas mensagens (o bash escreve o nome do sinal e o do programa):
$ ./nulo Falha de segmentação (imagem do núcleo gravada) ./nulo $ ./divzero antes Exceção de ponto flutuante (imagem do núcleo gravada) ./divzero $ ./excecao antes terminate called after throwing an instance of 'std::runtime_error' what(): deu ruim Abortado (imagem do núcleo gravada) ./excecao $ ./doublefree free(): double free detected in tcache 2 Abortado (imagem do núcleo gravada) ./doublefree
Quando dá errado
Baixando o compilador… para sempre"
O que significa: o download de cerca de 33 MB está lento ou foi interrompido. Se falhar, a caixa mostra Não consegui carregar o compilador: ….
Como consertar: confira a internet e clique em Rodar de novo. Bloqueadores de conteúdo muito agressivos e o modo "economia de dados" de alguns celulares podem atrapalhar. Depois que baixa uma vez, não baixa mais.
O que significa: quase sempre ele está esperando você digitar: há um std::cin e a caixa mostrou o campo de entrada no terminal. Outra possibilidade: um laço infinito, que o editor para sozinho em 15 segundos.
Como consertar: clique no terminal da caixa, digite e tecle Enter. Ou clique em ■ Parar.
O que significa: três causas comuns. (1) Você compilou sem -std=c++23 e o seu g++ usou o C++17 (aula Versões do C++). (2) O programa tem comportamento indefinido (tabela acima). (3) O programa depende de algo que só um dos lados tem: threads, system(), o tamanho do long.
Como consertar: compile sempre com o comando padrão do guia, g++ -std=c++23 -Wall -Wextra, leia os avisos, e confira a tabela "O que é diferente".
O que significa: a comparação é exata: uma letra maiúscula, um acento, um espaço ou um ponto final a mais ou a menos fazem diferença. Algumas missões também pedem um recurso específico; a pista entre parênteses diz o que falta.
Como consertar: compare a sua saída com a pedida, caractere por caractere. Se ainda assim não sair, use Ver solução e compare os códigos.
Referência
| No terminal da caixa | Significa |
|---|---|
$ clang++ -std=c++23 -Wall -Wextra programa.cpp -o programa | O comando de compilação (o editor usa o Clang) |
(compilando…) | O compilador está trabalhando |
arquivo:linha:coluna: error: … | Erro de compilação: o programa não roda |
arquivo:linha:coluna: warning: … | Aviso: o programa roda, mas confira |
$ ./programa … | O programa começou a rodar, com os argumentos |
Abortado, Falha de segmentação, Exceção de ponto flutuante + (imagem do núcleo gravada) | O programa "quebrou" (como no Linux) |
[código de saída: N] | Como terminou: 0 bem; outro número, problema (1 = a compilação falhou; 130 = interrompido; 134, 136, 139 = quebrou) |
| Ação | Como |
|---|---|
| Rodar | ▶ Rodar ou Ctrl+Enter |
| Parar | ■ Parar ou Ctrl+C no campo de entrada |
| Digitar a entrada | No campo que aparece no terminal; Enter envia, Ctrl+D encerra |
| Voltar ao original | Restaurar |
| Ver uma solução | Ver solução → Sim, mostrar |
Exercícios
1. Qual compilador as caixas Experimente usam?
2. O g++ diz ‘total’ was not declared in this scope. O que o Clang do editor diz no mesmo caso?
3. Um programa lê um v[10] num vetor de 3 elementos. No editor, ele mostrou 0 e continuou. O que isso prova?
4. O terminal da caixa terminou com [código de saída: 130]. O que aconteceu?
5. O tamanho do long
Quantos bytes tem um long no editor do guia (WebAssembly de 32 bits)?
Missão final: o código de saída
Missão: programas avisam que algo deu errado terminando com um código diferente de 0. Faça este programa mostrar Arquivo não encontrado. e terminar com o código 3: troque o texto e o return 0;. Confira o [código de saída: 3] no fim do terminal da caixa.
#include <iostream>
int main() {
std::cout << "Tudo certo.\n";
return 0;
}
#include <iostream>
int main() {
std::cout << "Arquivo não encontrado.\n";
return 3;
}
No terminal da Ana, o código aparece com echo $?:
$ ./saida Algo deu errado. $ echo $? 3
Resumo
- As caixas Experimente compilam C++ de verdade com o Clang 22 em WebAssembly, no navegador, com
-std=c++23 -Wall -Wextra, e rodam o programa. - Na primeira vez, o navegador baixa uns 33 MB; depois, fica guardado.
- O terminal da caixa mostra o comando, os erros e avisos, a saída e o
[código de saída: N]. std::cin: o programa pausa e você digita no terminal da caixa (Enter envia, Ctrl+D encerra, Ctrl+C para). Argumentos e abas funcionam como no terminal.- Missões conferem o resultado; Restaurar volta ao original; Ver solução mostra uma solução.
- Clang e g++ dizem a mesma coisa com palavras diferentes:
use of undeclared identifier×was not declared in this scope. Leia sempre a primeira mensagem. - Diferenças:
longe ponteiros têm 4 bytes no editor e 8 no Linux; threads,system(), gdb e sanitizers só no seu computador; erros de memória podem passar em silêncio no editor. - Próximo passo: o seu primeiro programa, linha por linha, em Olá, Mundo.