Saltar para o conteúdo
Topos Uranos

Resumo

Um programa imperativo não calcula seu resultado de uma vez: constrói-o por passos, guardando valores intermediários e alterando-os. Esta aula estuda o lugar onde eles são guardados, a variável, que é uma posição de memória com um nome, um tipo e um valor. Ensina a declará-la e inicializá-la com chaves, e por que as chaves são a forma preferida; a alterar seu valor por atribuição, cujo sinal = não significa o que significa na matemática; a acompanhar o estado de um programa, isto é, o valor de todas as suas variáveis em cada instante, com uma tabela de rastreamento; a escolher nomes que digam o que a variável guarda, e a evitar o erro mais silencioso desta etapa: ler uma variável à qual nunca se deu valor, o que em C++ é comportamento indefinido.

Objetivos de aprendizagem

  1. Declarar e inicializar variáveis com chaves, e distinguir a inicialização da atribuição em um programa dado.
  2. Rastrear à mão o estado de um programa de atribuições sucessivas com uma tabela de rastreamento, e prever assim sua saída.
  3. Escolher nomes em inglês que digam o que cada variável guarda, segundo as regras da linguagem e o guia do curso.
  4. Explicar por que ler uma variável não inicializada é comportamento indefinido, reconhecê-lo em um programa e preveni-lo inicializando sempre.

A variável como posição de memória

Na aula Do problema ao algoritmo os algoritmos foram escritos com letras como qq e rr, que recebiam um valor e depois outro: “rr recebe o valor r−br - b”. Na matemática, uma letra designa um valor fixo, embora desconhecido; em um algoritmo, ao contrário, designa um lugar cujo conteúdo muda. Um programa em C++ precisa do mesmo, e o obtém da memória do computador.

A memória principal é uma longa sucessão de bytes, cada um com seu número de ordem, seu endereço. Uma variável é um trecho dessa memória ao qual o programa dá um nome e um tipo. Tem, portanto, quatro atributos:

  1. um nome, com o qual o programa a designa (count, price);
  2. um tipo, que fixa que valores ela pode guardar, quantos bytes ocupa e que operações admite: int guarda números inteiros, double números com casas decimais;
  3. um valor, o que ela guarda em um instante dado, que pode mudar enquanto o programa é executado;
  4. um lugar na memória, que o compilador e o sistema escolhem e que o programa quase nunca precisa conhecer.

A imagem que convém reter é a de uma caixa: o nome escrito em cima, o valor dentro. O tipo é o tamanho e a forma da caixa; uma caixa de int não admite 2.5, assim como um escaninho de cartas não admite um pacote. As figuras desta aula desenham assim o estado de um programa, e o redesenham depois de cada instrução.

Que o tipo fixa o tamanho pode ser visto: o operador sizeof dá o número de bytes que uma variável ou um tipo ocupa.

Programa em C++
#include <print>​int main(){    const int count{12};    const double price{4.5};    std::println("count ocupa {} bytes", sizeof(count));    std::println("price ocupa {} bytes", sizeof(price));}
Saída
count ocupa 4 bytesprice ocupa 8 bytes

Um int ocupa aqui 4 bytes, e um double, 8. Esses números não são os mesmos em todos os sistemas, e deles depende quantos valores distintos cabem em cada tipo; as aulas Os inteiros e sua representação e Os números de ponto flutuante vão estudá-lo. Aqui basta o essencial: o tipo de uma variável é fixado ao declará-la e não muda nunca; o que muda é seu valor.