O Básico • Capítulo 3

Visão Geral


programs

Programas • Úteis para o teatro.

Neste capítulo preparei uma visão geral dos recursos básicos de C. Existem bem poucos recursos em C, e a sintaxe é relativamente simples. Mas isso não significa que é fácil. Toda a profundidade se esconde debaixo da superfície. Por causa disso vamos cobrir rapidamente os recursos e a sintaxe agora, e depois os veremos em maior profundidade à medida que continuamos.

O objetivo deste capítulo é colocar todo mundo no mesmo nível. Pessoas totalmente novatas em C deverão portanto tomar algum tempo nele, enquanto outros já com alguma experiência podem achar fácil dar uma olhada rápida e voltar depois caso necessário.

Programas


Um programa em C consiste em somente definições de funções e definições de estruturas.

Portanto um arquivo de código-fonte é simplesmente uma lista de funções e tipos (types). Estas funções podem chamar umas às outras ou a si próprias, e podem usar quaisquer tipos de dados que foram declarados ou já venham com a linguagem.

É possível chamar funções em outras bibliotecas, ou usar seus tipos de dados. É assim que camadas de complexidade são acumuladas em programação C.

Como vimos no capítulo anterior, a execução de um programa C sempre começa na função chamada main. Daqui ela chama mais e mais funções, para executar todas as ações que ela requer.

Variáveis


Funções em C consistem em manipulação de variáveis. Estas são itens de dados aos quais damos um nome.

Cada variável em C tem um tipo explícito. Esses tipos são declarados por nós mesmos ou já vêm com a linguagem. Podemos declarar uma nova variável escrevendo o nome do seu tipo, seguida do seu nome, e opcionalmente setando-a para algum valor usando =. Esta declaração é um comando (statement), e terminamos todos os comandos em C com um ponto e vírgula ;.

Para criar um novo int chamado contagem podemos escrever o seguinte...

int contagem;

Ou declará-lo e setar o valor...

int contagem = 10;

Aqui estão algumas descrições e exemplos de alguns dos tipos de dados que já vêm com a linguagem.

void Tipo vazio
char Caractere único/Byte char last_initial = 'H';
int Inteiro int age = 23;
long Inteiro que pode guardar valores maioreslong age_of_universe = 13798000000;
float Número decimal float liters_per_pint = 0.568f;
doubleNúmero decimal com mais precisão double speed_of_swallow = 0.01072896;

Declarações de funções


Uma função é uma computação que manipula variáveis, e opcionalmente muda o estado de um programa. Ela recebe como entrada algumas variáveis e devolve uma variável única como saída.

Para declarar uma função, escrevemos o tipo da variável que ela devolve, o nome da função, e a seguir entre parênteses uma lista das variáveis ela recebe como entrada, separada por vírgulas. O conteúdo da função é colocado dentro de chaves {}, e lista todos os comandos que a função executa, terminados por pontos e vírgulas ;. O comando return é usado para deixar a função finalizar e devolver o valor de uma variável.

Por exemplo, uma função que recebe duas variáveis int chamadas x e y e soma-as poderia parecer com isto:

int calcula_soma(int x, int y) {
  int resultado = x + y;
  return resultado;
}

Nós chamamos funções escrevendo seu nome e colocando os argumentos para a função entre parênteses, separados por vírgulas. Por exemplo, para chamar a função acima e armazenar o resultado em uma variável somados poderíamos escrever o seguinte:

int somados = calcula_soma(10, 18);

Declarações de estruturas


Estruturas são usadas para declarar novos tipos. Estruturas são um conjunto de variáveis aglomeradas em um único pacote.

Nós podemos usar estruturas para representar tipos de dados mais complexos. Por exemplo, para representar um ponto no espaço 2D nós poderíamos criar uma estrutura chamada point que empacota dois valores float (decimais) chamados x e y. Para declarar estruturas nós podemos usar a palavra-chave struct em conjunto com a palavra-chave typedef. Nossa declaração se pareceria com isto:

typedef struct {
  float x;
  float y;
} point;

Podemos colocar esta definição acima de quaisquer funções que desejam usá-la. Este tipo não é diferente dos tipos de dados embutidos na linguagem, e podemos usá-lo em todas as mesmas maneiras. Para acessar um campo individual, usamos um ponto ., seguido do nome do campo, como x.

point p;
p.x = 0.1;
p.y = 10.0;

float length = sqrt(p.x * p.x + p.y * p.y);

Apontadores (pointers ou ponteiros)


pointer

Pointer • Um com cabelo curto

Um apontador é uma variação de um tipo normal onde o nome do tipo é sufixado com um asterisco. Por exemplo, poderíamos declarar um apontador para um inteiro escrevendo int*. Já vimos um tipo apontador antes: char** argv. Este é um apontador para apontadores de caracteres, e é usado como entrada para a função main.

Apontadores são usadas para uma grande quantidade de coisas como strings (tipo de dados de texto) ou listas. Eles são uma parte difícil de C e serão explicados em maior detalhe nos capítulos posteriores. Não faremos uso deles por um tempo, então por enquanto é simplesmente bom saber que eles existem, e como identificá-los. Não deixe eles assustarem você!

Strings


Em C, strings são representadas pelo apontador char*. Por baixo dos panos, eles são armazenados como uma lista de caracteres onde o caractere final é um caractere especial chamado o terminador null. Strings são uma parte complicada e importante de C, que aprenderemos a usar efetivamente nos próximos capítulos.

Strings podem ser declaradas literalmente colocando seu texto entre aspas. Usamos isso no capítulo anterior com nossa string "Hello, World!". Por ora, lembre-se que se você ver char*, pode lê-lo como string.

Condicionais


Comandos condicionais permitem ao programa executar algum código apenas se determinadas condições são satisfeitas.

Para executar código sob alguma condição nós usamos o comando if. Este é escrito como if seguido de alguma condição entre parênteses, seguida do código para executar entre chaves. Um comando if pode ser seguido opcionalmente por um comando else, seguido de outras comandos entre chaves. O código dentro dessas chaves será executado no caso em que a condição é falsa.

Podemos testar múltiplas condições usando os operadores lógicos || para OU, e && para E.

Dentro dos parênteses de um comando condicional, qualquer valor que não for 0 será avaliado como verdadeiro. Isso é importante lembrar pois muitas condições usam isto para checar coisas implicitamente.

Se desejássemos checar se um int chamado x fosse maior que 10 e menor que 100, escreveríamos o seguinte:

if (x > 10 && x < 100) {
  puts("x eh maior que 10 e menor que 100!");
} else {
  puts("x eh menor que 11 ou maior que 99!");
}

Laços


Laços permitem que algum código seja repetido até que alguma condição se torne falsa, ou algum contador termine.

Há dois laços principais em C. O primeiro é o laço while (enquanto). Este laço repete a execução de um bloco de código até que alguma condição se torne falsa. Ele é escrito com while seguido de uma condição entre parênteses, seguida do código a ser repetido entre chaves. Por exemplo, um laço que conta para baixo de 10 a 1 poderia ser escrito da maneira que segue.

int i = 10;
while (i > 0) {
  puts("Loop Iteration");
  i = i - 1;
}

O segundo tipo de laço é o for. No lugar de uma condição, este laço requer três expressões separadas por pontos e vírgulas ;. Estas são: um inicializador, uma condição e um incrementador. O inicializador é executado antes do laço começar. A condição é checada a antes de cada iteração do laço. Caso for falsa, o laço é interrompido. O incrementador é executado ao fim de cada iteração do laço. Estes laços são frequentemente usados para contar pois são mais compactos que o laço while.

Por exemplo, para escrever um laço que conta para cima de 0 a 9, poderíamos escrever o código a seguir -- neste caso o operador ++ incrementa (isto é, aumenta de 1 em 1) a variável i.

for (int i = 0; i < 10; i++) {
  puts("Loop Iteration");
}

Metas bônus


  • › Use um laço for para imprimir Hello World! 5 vezes.
  • › Use um laço while para imprimir Hello World! 5 times.
  • › Declare uma função que imprima Hello World! n vezes. Chame-a desde a função main.
  • › Quais outros tipos embutidos existem que não foram listados?
  • › Quais outros operadores condicionais existem que além de maior que >, e menor que <?
  • › Quais outros operadores matemáticos existem além de soma +, e subtração -?
  • › O que é o operador +=, e como ele funciona?
  • › O que é o laço do, e como ele funciona?
  • › O que é o comando switch e como ele funciona?
  • › O que é a palavra-chave break e o que ela faz?
  • › O que é a palavra-chave continue e o que ela faz?
  • › O que a palavra-chave typedef faz exatamente?

Navegação

‹ Instalação

• Conteúdo •

Um Prompt Interativo ›