De "compila" para "consigo ler"
Na página anterior você pegou um arquivo de código-fonte e o transformou em um programa em execução com um compilador. Agora vamos com mais calma e olhar o que realmente havia naquele arquivo. Todo programa em C++ é construído a partir do mesmo conjunto de peças estruturais e, quando você souber nomeá-las, um arquivo .cpp desconhecido deixa de parecer ruído.
Aqui está um programa completo e executável. Leia uma vez e depois vamos desmontá-lo linha por linha.
Cinco linhas com conteúdo, e cada uma delas cumpre uma função específica. Vamos percorrê-las.
A linha #include
#include <iostream>
Esta linha traz o cabeçalho <iostream> para que você possa usar recursos de entrada/saída como cout. O #include é uma diretiva de pré-processador: ela roda antes da compilação de verdade e, basicamente, cola o conteúdo daquele cabeçalho no seu arquivo.
Duas coisas tornam as linhas #include especiais:
- Elas começam com
#, que as marca como diretivas de pré-processador. - Elas não terminam com ponto e vírgula. Essa é a exceção comum ao hábito de "toda linha termina em
;" que você está prestes a adquirir.
Se você usar cout mas esquecer #include <iostream>, o compilador não saberá o que é cout e você verá um erro como 'cout' was not declared in this scope. A solução quase sempre é um include faltando.
A função main
int main() {
// ...
return 0;
}
main é onde seu programa começa. Quando você roda o programa compilado, a execução começa na primeira linha dentro de main e para quando main retorna. Todo programa em C++ tem exatamente um main: nem mais, nem menos.
As peças:
int-maindevolve um inteiro ao sistema operacional. Por convenção,0significa "terminou com sucesso".main()- o nome, seguido de parênteses para seus parâmetros (vazios aqui).{ ... }- as chaves envolvem o corpo: as instruções que rodam.return 0;- encerramaine informa sucesso. Se você omitir, o C++ tratamaincomo se ele tivesse retornado0por você, mas escrevê-lo deixa sua intenção clara.
Instruções e o ponto e vírgula
Uma instrução é uma ordem completa. Em C++, toda instrução termina com um ponto e vírgula:
O C++ ignora completamente quebras de linha e espaços extras. O compilador não se importa se você coloca as instruções em uma linha ou em dez: o ; é o que indica onde cada instrução termina. Estas três formas são idênticas para o compilador:
int a = 1; int b = 2;
int a = 1;
int b = 2;
int
a
= 1;
Essa liberdade vem acompanhada da armadilha mais comum entre iniciantes: um ponto e vírgula esquecido. Veja o que acontece aqui.
int x = 5 // <-- sem ponto e vírgula
int y = 10;
Você verá um erro como expected ';' before 'int'. Repare na pegadinha: o compilador só percebe que algo está errado quando chega à linha seguinte, então o número de linha informado costuma apontar uma linha abaixo do erro real. Quando um erro menciona um ; faltando, confira a linha acima da que aparece na mensagem.
As chaves definem blocos
Onde algumas linguagens usam indentação para agrupar código, o C++ usa chaves { }. Tudo entre um par de chaves correspondentes é um bloco. Corpos de funções, laços e instruções if usam isso:
As duas linhas dentro das chaves do if rodam apenas quando a condição é verdadeira. O último cout está fora das chaves, então sempre roda.
Como são as chaves, e não a indentação, que definem a estrutura, o C++ não te obriga a indentar. Mas você deve fazê-lo mesmo assim: a indentação é a forma como as pessoas leem a estrutura que as chaves definem. Um erro comum é uma chave sem par: cada { precisa de um } de fechamento. Se você esquecer um, o compilador costuma informar um erro perto do fim do arquivo (expected '}' at end of input), longe de onde você realmente errou. Contar suas chaves, ou deixar seu editor combiná-las para você, evita muita confusão.
Saída com cout e <<
Você já viu cout algumas vezes. É o fluxo de saída padrão, e você envia valores a ele com o operador << (leia como "coloque isto na saída"):
Você pode encadear << para imprimir várias coisas em sequência. endl encerra a linha (ele também esvazia o buffer); a sequência de escape "\n" é uma maneira mais leve de imprimir uma quebra de linha. Para programas simples, qualquer uma serve.
Sobre aquele using namespace std; no topo: os nomes da biblioteca padrão vivem no namespace std, então o nome completo é std::cout. Escrever using namespace std; uma vez permite que você omita o prefixo std:: e escreva apenas cout. É conveniente em exemplos curtos, mas em projetos grandes muitas equipes preferem o explícito std::cout para evitar conflitos de nomes, então não se surpreenda ao vê-lo escrito de qualquer uma das formas.
Agora você consegue ler o esqueleto de qualquer programa
Includes no topo, uma função main como ponto de entrada, instruções terminando em ponto e vírgula, chaves agrupando código em blocos e cout << para a saída: esse esqueleto está em quase todos os arquivos de C++ que você abrirá. O resto da linguagem são detalhes construídos sobre essas poucas formas. Quando um programa parecer intimidador, procure primeiro o main e depois leia as instruções em ordem; a estrutura vai te guiar.
A seguir: comentários
Por enquanto, cada linha dos seus programas é código que o compilador lê. A seguir vamos adicionar linhas que ele ignora de propósito - os comentários - para que você possa deixar anotações para si mesmo e para outros leitores. Você verá a forma de linha única // e a forma de bloco /* ... */, além de quando cada uma é a escolha certa.
Perguntas frequentes
Por que toda instrução em C++ precisa de ponto e vírgula?
O C++ ignora quebras de linha e espaços em branco, então precisa de uma marcação explícita para saber onde uma instrução termina e a próxima começa. Essa marcação é o ponto e vírgula ;. Esquecer um ponto e vírgula é o erro de compilação mais comum entre iniciantes, e o número de linha informado costuma ser a linha seguinte àquela em que você o esqueceu.
O que int main() faz em C++?
main é a função a partir da qual o programa começa a rodar: a execução começa na sua primeira linha e termina quando ela retorna. Todo programa em C++ precisa de exatamente um main. O int significa que ele devolve um código de status inteiro ao sistema operacional, em que 0 sinaliza sucesso por convenção.
Preciso escrever std:: antes de cout?
Você pode escrever std::cout (totalmente qualificado) ou adicionar using namespace std; uma vez no topo e depois escrever apenas cout. A forma qualificada é mais segura em arquivos grandes; using namespace std; é um atalho comum em exemplos pequenos e tutoriais.