C Olá, Mundo

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

Você vai aprender
  • Criar a pasta e o arquivo ola.c no editor nano.
  • O que faz cada parte do Olá, mundo: #include <stdio.h>, int main(void), { }, printf, as aspas, o \n, o ; e o return 0;.
  • Compilar com gcc ola.c -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.
  • Ver o código de saída com echo $? e por que o return 0; é opcional só 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 gcc 15.2 do Ubuntu 26.04, numa pasta chamada ~/c. 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 quase tudo no editor do guia, que compila e 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 CNesta aula
A receita no papelO código-fonte: um arquivo de texto que você escreveola.c
A cozinheira que lê a receita e faz o boloO compiladorgcc
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 assar outro bolo: mudou o código, compile de novo. Guarde essa ideia, porque ela explica muitos 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 c                « cria a pasta "c" dentro da sua pasta pessoal
$ cd c                   « entra nela

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

Agora crie o arquivo. Qualquer editor de texto serve (o VS Code, o Kate, o gedit… veja Editores e IDEs). Aqui vamos usar o nano, que roda dentro do próprio terminal e já vem no Ubuntu:

$ nano ola.c             « abre o nano com um arquivo novo chamado ola.c

O terminal vira um editor. No alto aparece GNU nano 8.7.1 e o nome ola.c; embaixo, [ Novo arquivo ] e uma lista de atalhos, como ^O Gravar e ^X Sair. O ^ quer dizer a tecla Ctrl. Digite o programa:

#include <stdio.h>

int main(void) {
    printf("Olá, mundo!\n");
    return 0;
}
  1. Digite as seis linhas exatamente como estão (a linha 2 fica em branco; na linha 4, quatro espaços antes do printf).
  2. Aperte Ctrl + O (^O Gravar). Embaixo aparece Escrever para o arquivo: ola.c.
  3. Aperte Enter para confirmar o nome. O nano responde [ Escrita 6 linhas ].
  4. Aperte Ctrl + X (^X Sair) para voltar ao terminal.

Três cuidados ao salvar:

  • A extensão é .c. Ela diz ao compilador e ao editor que o arquivo é código C. (Arquivos .h também são C, mas são outra coisa: aula Arquivos .h e .c.)
  • Sem espaços e sem acentos no nome: ola.c, e não olá mundo.c. 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 em C 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.c
$ cat ola.c
#include <stdio.h>

int main(void) {
    printf("Olá, mundo!\n");
    return 0;
}

2. O programa, linha por linha

São seis 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 <stdio.h>

O C "puro" sabe muito pouco: ele nem sabe mostrar texto na tela. Isso fica na biblioteca padrão, um conjunto de ferramentas prontas que vem junto com o compilador, dividida em arquivos chamados cabeçalhos (headers, com a extensão .h). A linha 1 pede: "antes de compilar, cole aqui o cabeçalho stdio.h".

#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: Pré-processador.)
<stdio.h>
O nome do cabeçalho. stdio vem de standard input/output, "entrada e saída padrão" (pronuncia-se "estê-dê-í-ó"). Ele traz o printf, que mostra texto, e outras funções de entrada e saída, como o scanf (aula Entrada com scanf). Os sinais < > 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(void) {

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 (você vai ver o erro no fim da aula).

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).
(void)
Os parênteses guardam o que a função recebe. void quer dizer "vazio": esta main não recebe nada. Em Argumentos da Linha de Comando você vai ver uma main que recebe coisas.
{
A chave de abertura: "aqui começa o corpo da main". Tudo até a chave de fechamento } correspondente pertence a ela.
int main(void) ou int main()?

Você vai ver as duas formas em livros e sites. Até o C17, os parênteses vazios queriam dizer "não sei o que a função recebe", e o (void) era o jeito certo de dizer "não recebe nada". No C23, () passou a significar o mesmo que (void). O guia usa (void) porque funciona igual em todas as versões do C.

Linha 4: printf("Olá, mundo!\n");

Esta é a 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.

printf
De print formatted, "imprimir formatado" (pronuncia-se "print-éf"). É uma função da biblioteca padrão, que veio com o stdio.h: ela mostra na tela o texto que você der a ela. "Imprimir", em programação, quase sempre quer dizer "mostrar na tela", não "mandar para a impressora". O "formatado" é porque ele também sabe encaixar números no meio do texto (aula Saída com printf).
( )
Os parênteses depois do nome chamam a função: "printf, faça o seu trabalho com isto aqui dentro". O que vai entre eles se chama argumento.
"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 e Escapes).
;
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: return 0;

return = "devolver". Termina a main e entrega o número 0 ao sistema, que quer dizer "terminei sem problemas". A seção 6 mostra esse número chegando ao terminal.

Linha 6: }

A chave de fechamento: "acabou a main". Toda { precisa de uma }, como parênteses numa conta.

Teclas difíceis no teclado brasileiro (ABNT2)

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


3. Compilar: de texto para programa

O arquivo ola.c é só texto. O computador não sabe rodá-lo. Quem transforma o texto em programa é o compilador gcc (de GNU Compiler Collection, a coleção de compiladores do projeto GNU):

$ gcc ola.c -o ola
$                        « nada! no mundo dos compiladores, silêncio = deu certo

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

$ ls
ola  ola.c               « "ola" é o programa (no terminal, ele aparece em verde: é executável)
gcc
O compilador.
ola.c
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 .c, é o costume.

Este é o comando mínimo. Na próxima aula, Compilar com gcc, você vai acrescentar opções que escolhem a versão do C e fazem o compilador avisar sobre erros prováveis. A partir dela, o guia usa sempre o comando completo: gcc -std=c23 -Wall -Wextra ola.c -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 gcc, o terminal procura o programa numa lista fixa de pastas do sistema (a variável PATH). A sua pasta ~/c 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 <stdio.h>

int main(void) {
    printf("Olá, mundo!\n");
    return 0;
}
#include <stdio.h>

int main(void) {
    printf("Olá, Ana!\n");
    return 0;
}

Repare na primeira linha que o editor mostra: $ clang -std=c23 -Wall -Wextra programa.c -o programa. O editor usa o Clang, outro compilador de C, em vez do gcc, e já com as opções completas da próxima aula. O resultado é o mesmo.


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

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

$ gcc ola.c
$ ls
a.out  ola  ola.c        « 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 15952 out 17 10:30 a.out
-rwxrwxr-x 1 ana ana 15952 out 17 10:30 ola
-rw-rw-r-- 1 ana ana    83 out 17 10:30 ola.c

Repare nos tamanhos: as 6 linhas de texto ocupam 83 bytes; o programa pronto, 15952 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 gcc já cria o programa com permissão para rodar.

Por que "a.out"?

É um nome histórico, dos primeiros sistemas Unix dos anos 1970, a mesma época e o mesmo lugar em que o C nasceu: assembler output, "saída do montador". O nome ficou até hoje. O problema do a.out é que cada compilação sem -o sobrescreve a 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

Todo programa, quando termina, entrega um número ao sistema: o código de saída. Na main, quem escolhe esse número é o return:

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. 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 (o comando que mostra um texto):

$ ./ola
Olá, mundo!
$ echo $?
0                        « o 0 do return 0;

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

#include <stdio.h>

int main(void) {
    printf("Saindo com 3\n");
    return 3;
}
$ gcc saida3.c -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 gcc faz isso: quando a compilação falha, ele sai com o código 1 (você vai ver na seção "Quando dá errado"). O editor do guia mostra o código de saída embaixo da saída do programa, como [código de saída: 0].

Missão: faça o programa mostrar Até logo! e terminar com o código de saída 7. Confira o número que o editor mostra no fim.

#include <stdio.h>

int main(void) {
    printf("Olá, mundo!\n");
    return 0;
}
#include <stdio.h>

int main(void) {
    printf("Até logo!\n");
    return 7;
}

E se eu esquecer o return 0;?

Na main, e só nela, nada de ruim acontece. Desde o C99, a regra é: se a main chegar ao } final sem return, o C age como se lá estivesse return 0;.

#include <stdio.h>

int main(void) {
    printf("Olá, mundo!\n");
}
$ gcc semreturn.c -o semreturn
$ ./semreturn
Olá, mundo!
$ echo $?
0                        « mesmo sem return, deu 0

No C antigo (C89, de 1989), essa regra não existia. Compilando o mesmo arquivo como C89, o código de saída vira um número qualquer:

$ gcc -std=c89 semreturn.c -o semreturn89
$ ./semreturn89
Olá, mundo!
$ echo $?
13                       « lixo: por acaso, o número de bytes que o printf escreveu
Com ou sem return 0;?

Os dois estão certos no C de hoje. Mesmo assim, nos exemplos do Nível 1 o guia sempre escreve o return 0;: ele deixa claro onde o programa termina, funciona em qualquer versão do C e prepara você para as outras funções. Nelas, esquecer o return é um problema sério (aula Valor de Retorno).


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 <stdio.h>

int main(void) {
    printf("Olá! Eu sou a Ana.\n");
    printf("Estou aprendendo C.\n");
    printf("Este é o meu primeiro programa.\n");
    return 0;
}
$ gcc apresentacao.c -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 está em Novas Linhas e Escapes. Mostrar números junto com o texto (printf("Idade: %d\n", 29);) está em Saída com printf.

Outras formas de escrever o Olá, mundo

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

FormaOnde aparece
int main(void) { printf("Olá, mundo!\n"); return 0; }A forma deste guia. Funciona em qualquer versão do C.
int main() { … }Muito comum em livros e sites. No C23 é igual a (void).
Sem o return 0;Código moderno, a partir do C99. Vale só na main.
puts("Olá, mundo!");Outra função do stdio.h, que já pula a linha sozinha (aula Saída com printf).
main() { printf("hello, world\n"); }O exemplo original do livro de Kernighan e Ritchie (1978). Não compila no C de hoje: o tipo int não pode mais faltar (veja Versões do C).

Qual usar? A primeira, por enquanto. Ela é a mais clara e não depende da versão do C.


Quando dá errado

Errar faz parte. Um erro de compilação não estraga nada: o gcc 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 gcc 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.c está lá, compile (gcc ola.c -o ola) e leia se apareceu algum erro. Se nem o ola.c aparece, entre na pasta certa com cd ~/c.

fatal error: ole.c: Arquivo ou diretório inexistente
$ gcc ole.c -o ola
cc1: fatal error: ole.c: 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.c.txt, ola.txt). Fatal error = "erro fatal"; compilation terminated = "compilação encerrada". O cc1 é a parte do gcc 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.c’ is the same as output file
$ gcc ola.c -o ola.c
gcc: fatal error: input file ‘ola.c’ 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.c, o que apagaria o seu código. O gcc se recusa, e isso salvou o seu arquivo.

Como consertar: o nome depois do -o é o do programa, sem .c: gcc ola.c -o ola.

error: expected ‘;’ before ‘return’
#include <stdio.h>

int main(void) {
    printf("Olá, mundo!\n")
    return 0;
}
$ gcc semponto.c -o semponto
semponto.c: In function ‘main’:
semponto.c:4:28: error: expected ‘;’ before ‘return’
    4 |     printf("Olá, mundo!\n")
      |                            ^
      |                            ;
    5 |     return 0;
      |     ~~~~~~
$ echo $?
1                        « o gcc avisa que falhou: código 1

O que significa: "esperava ; antes do return". Faltou o ponto e vírgula no fim da linha 4. A mensagem diz o arquivo (semponto.c), a linha (4) e a coluna (28), e o gcc até desenha o ; no lugar onde ele deveria estar. As aspas tortas (‘ ’) fazem parte da mensagem do gcc.

Como consertar: coloque o ; no fim da linha 4 e compile de novo. No editor do guia, o Clang diz a mesma coisa com outras palavras: error: expected ';' after expression. Ler mensagens assim, com calma, é o assunto da aula Lendo Erros do Compilador.

error: implicit declaration of function ‘printf’
int main(void) {
    printf("Olá, mundo!\n");
    return 0;
}
$ gcc seminclude.c -o seminclude
seminclude.c: In function ‘main’:
seminclude.c:2:5: error: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
    2 |     printf("Olá, mundo!\n");
      |     ^~~~~~
seminclude.c:1:1: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
  +++ |+#include <stdio.h>
    1 | int main(void) {
seminclude.c:2:5: warning: incompatible implicit declaration of built-in function ‘printf’ [-Wbuiltin-declaration-mismatch]
    2 |     printf("Olá, mundo!\n");
      |     ^~~~~~
seminclude.c:2:5: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’

O que significa: esqueceu o #include <stdio.h>. Sem ele, o compilador não sabe o que é printf ("declaração implícita da função"). A note (nota) já dá a solução: include ‘<stdio.h>’, e o +++ |+ mostra a linha que falta, no lugar certo.

Como consertar: acrescente #include <stdio.h> na primeira linha.

undefined reference to `main' (em português: referência não definida para "main")
$ cat semmain.c
#include <stdio.h>
$ gcc semmain.c -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 gcc não. Em inglês ela diz undefined reference to `main'.

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


Referência rápida

EscritaO que faz
#include <stdio.h>Traz o printf (e outras funções de entrada e saída) da biblioteca padrão
int main(void) { … }A função principal: o programa começa e termina nela
printf("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, desde o C99)
nano ola.cAbre (ou cria) o arquivo no editor nano; Ctrl+O grava, Ctrl+X sai
gcc ola.c -o olaCompila ola.c e cria o programa ola
gcc ola.cCompila 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 printf:

#include <>

2. Compilar com nome

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

gcc jogo.c

3. Rodar

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

$

4. O código de saída

Que comando mostra o código de saída do último programa que rodou?

$

5. Você compilou com gcc teste.c, sem -o. Como se chama o programa criado?

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

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

8. Você mudou o texto do printf no ola.c e rodou ./ola, mas apareceu o texto antigo. Por quê?

Missão final: o cartão de visita

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

Ana Souza
Programadora C
Recife - PE

Use um printf para cada linha, não esqueça os \n e termine com return 0;. Se o compilador reclamar, leia a linha e a coluna da mensagem.

// escreva o programa inteiro aqui

#include <stdio.h>

int main(void) {
    printf("Ana Souza\n");
    printf("Programadora C\n");
    printf("Recife - PE\n");
    return 0;
}

Resumo

  • Programar em C tem três passos: escrever o código (ola.c), compilar (gcc ola.c -o ola) e rodar (./ola). Mudou o código? Compile de novo.
  • #include <stdio.h> traz o printf; int main(void) { … } é onde o programa começa; printf("…"); mostra texto; \n quebra a linha; ; termina a instrução.
  • O gcc 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; entrega o código de saída 0 ("deu certo"), que aparece com echo $?. Desde o C99 ele é opcional só na main; o guia o escreve sempre.
  • Próximo passo: Compilar com gcc, onde você aprende o comando completo que o guia usa daqui para a frente.