Variáveis: Gavetas com Nome para Guardar Valores

Variáveis: Gavetas com Nome para Guardar Valores

O conceito mais fundamental da programação, explicado pela metáfora da gaveta: o que é uma variável, como declará-la, guardar e ler valores. Inclui a maior fonte de confusão inicial — por que o sinal de igual significa atribuição e não igualdade matemática — e as regras para nomear bem.
Linguagem C#

• • 10 min de leitura

Até agora, nossos programas apenas exibiram textos que escrevemos de antemão. Eles falavam, mas não lembravam de nada. Um programa verdadeiramente útil precisa guardar informações para usá-las depois: o nome que o usuário digitou, o resultado de uma conta, a quantidade de itens numa lista. Para isso existe o conceito mais fundamental de toda a programação — tão fundamental que, sem ele, nada mais se constrói. Esse conceito é a variável. Nesta aula, você entenderá o que é uma variável, como criá-la, como guardar valores nela e como recuperá-los. É um passo modesto na aparência, mas é a porta de entrada para programas que de fato pensam.

A metáfora da gaveta

Imagine uma cômoda cheia de gavetas. Cada gaveta pode guardar um objeto, e cada uma tem uma etiqueta com um nome, para que você saiba o que há dentro sem precisar abri-la. Você pode colocar algo numa gaveta, olhar depois o que guardou, e até trocar o conteúdo por outro. Uma variável é exatamente isso, dentro da memória do computador: um espaço com um nome onde o programa guarda um valor, podendo consultá-lo e alterá-lo depois. O nome é a etiqueta; o valor é o que está guardado dentro.

Essa metáfora, embora simples, já contém as três operações que você fará com variáveis o tempo todo: criar a gaveta (dar-lhe um nome), guardar um valor nela, e ler o valor que está lá. Vamos ver cada uma em C#.

Criando e guardando: a declaração

Criar uma variável em C# se chama declarar a variável. A forma básica exige que você diga duas coisas: que tipo de valor a gaveta vai guardar, e qual será o seu nome. Veja um primeiro exemplo:

int idade;

Essa linha declara uma variável. A palavra int diz o tipo — aqui, um número inteiro (do inglês integer); estudaremos os tipos em detalhe na próxima aula, mas por ora saiba que int significa "esta gaveta guardará um número inteiro". A palavra idade é o nome que escolhemos para a variável — a etiqueta da gaveta. E o ponto e vírgula, como você já sabe, encerra a instrução. Neste momento, criamos a gaveta idade, mas ainda não guardamos nada nela.

Para guardar um valor, usamos o sinal de igual (=), chamado operador de atribuição:

idade = 30;

Aqui é preciso um cuidado importante, porque este é um ponto onde a intuição da matemática engana. O sinal =, em programação, não significa "é igual a" no sentido matemático. Ele significa "guarde, na variável à esquerda, o valor à direita". Leia idade = 30 não como "idade é igual a 30", mas como "guarde o valor 30 na gaveta chamada idade". A seta mental correta aponta da direita para a esquerda: o valor 30 vai para dentro de idade. Compreender isso desde já evitará muita confusão adiante.

Podemos fazer as duas coisas — declarar e guardar — numa única linha, o que é o mais comum:

int idade = 30;   // cria a gaveta 'idade' e já guarda 30 nela

(O texto após // é um comentário: uma anotação para humanos que o computador ignora completamente. Comentários servem para explicar o código a quem o lê — inclusive a você mesmo, no futuro. Use-os para esclarecer suas intenções.)

Lendo o valor: usando a variável

Guardar um valor só é útil se pudermos recuperá-lo. Para ler uma variável, basta usar o seu nome onde você quer o valor que ela guarda. Por exemplo, podemos exibi-lo:

int idade = 30;
Console.WriteLine(idade);   // exibe: 30

Repare numa diferença sutil e crucial. Na aula anterior, escrevíamos Console.WriteLine("idade") — com aspas — e apareceria a palavra literal idade. Agora escrevemos Console.WriteLine(idade) — sem aspas — e aparece o valor guardado, 30. As aspas fazem toda a diferença: com aspas, é texto literal; sem aspas, é o nome de uma variável, e o C# substitui esse nome pelo valor guardado. Essa distinção entre "a palavra em si" e "o que a variável guarda" é fundamental, e vale fixá-la desde já.

Trocando o conteúdo: variáveis variam

O nome "variável" não é gratuito: o valor guardado pode variar ao longo do programa. Você pode guardar um novo valor na mesma gaveta, e o antigo é substituído:

int idade = 30;
Console.WriteLine(idade);   // exibe: 30

idade = 31;                 // guarda um novo valor; o 30 é substituído
Console.WriteLine(idade);   // exibe: 31

Note que, na segunda atribuição, não repetimos o int — o tipo é dito apenas uma vez, na declaração. Depois disso, a gaveta já existe, e apenas trocamos o que há dentro. Repetir int idade = 31 seria tentar criar uma segunda gaveta com o mesmo nome, o que o C# não permite. Declara-se uma vez; atribui-se quantas vezes quiser.

O valor à direita da atribuição pode, inclusive, envolver a própria variável. Isto é perfeitamente válido e muito comum:

int idade = 30;
idade = idade + 1;          // lê o valor atual (30), soma 1, e guarda o resultado (31)
Console.WriteLine(idade);   // exibe: 31

Leia idade = idade + 1 com a regra que aprendemos: "calcule o valor à direita (idade + 1, que é 30 + 1 = 31) e guarde-o na gaveta idade". Primeiro o lado direito é calculado usando o valor atual da variável; depois o resultado é guardado, substituindo o antigo. Se você tentasse ler isso como uma equação matemática ("idade é igual a idade mais um"), pareceria absurdo — e é por isso que insisti que = não é igualdade, e sim atribuição.

As regras dos nomes

Você tem liberdade para nomear suas variáveis, mas há regras e convenções. As regras (obrigatórias): um nome pode conter letras, números e o sublinhado (_), mas não pode começar com número, não pode conter espaços, e não pode ser uma palavra reservada da linguagem (como int, que já tem significado próprio). As convenções (fortemente recomendadas, embora não obrigatórias): dê nomes descritivos, que revelem o propósito da variável. Uma variável chamada idade ou precoTotal conta o que guarda; uma chamada x ou a, salvo em casos muito específicos, obriga quem lê a adivinhar. Em C#, a convenção para nomes de variáveis é começar com letra minúscula e, se o nome tiver várias palavras, iniciar cada palavra seguinte com maiúscula — um estilo chamado camelCase (precoTotal, nomeDoUsuario, quantidadeDeItens). Bons nomes são uma cortesia com quem lê seu código, e o principal leitor será você mesmo, semanas depois, tentando entender o que fez.

A variável é o primeiro conceito sem o qual nada mais se constrói, e ele já está assentado. Você sabe declarar uma variável dizendo seu tipo e seu nome, guardar um valor nela com o sinal de igual, ler esse valor usando o nome, e trocar o conteúdo quantas vezes quiser — afinal, variáveis variam.

O ponto que mais confunde quem começa também ficou resolvido: o sinal de igual não afirma uma igualdade matemática, ele ordena um armazenamento. A seta mental aponta da direita para a esquerda. É por isso que uma instrução como x = x + 1, absurda como equação, é perfeitamente sensata como atribuição.

Fontes e leituras recomendadas

Exercícios

Exercício 1

Num programa novo, declare uma variável int chamada ano e guarde nela o ano atual. Em seguida, exiba-a com Console.WriteLine. Depois, explique com suas palavras a diferença entre escrever Console.WriteLine(ano) e Console.WriteLine("ano").

Ver resposta

✓ Resposta: Exemplo:

int ano = 2026;
Console.WriteLine(ano);   // exibe 2026

A diferença: Console.WriteLine(ano), sem aspas, exibe o valor guardado na variável (2026), porque ano é lido como o nome de uma variável e substituído pelo seu conteúdo. Já Console.WriteLine("ano"), com aspas, exibe a palavra literal ano, porque tudo entre aspas é tratado como texto, não como nome de variável.

Exercício 2

Declare uma variável idade com o valor 20, exiba-a, depois atribua a ela o valor 21 e exiba de novo. Explique por que, na segunda atribuição, você não deve escrever int novamente.

Ver resposta

✓ Resposta: Exemplo:

int idade = 20;
Console.WriteLine(idade);   // 20
idade = 21;
Console.WriteLine(idade);   // 21

Não se escreve int na segunda atribuição porque a variável idade já foi criada (declarada) na primeira linha; a segunda apenas troca o valor guardado na gaveta que já existe. Repetir int idade seria tentar declarar uma segunda variável com o mesmo nome, o que o C# não permite.

Exercício 3

Escreva um programa que declare uma variável contador valendo 0, e depois execute três vezes a instrução contador = contador + 1, exibindo o valor após cada uma. Preveja a saída antes de rodar, e depois confirme. Explique, com a regra da atribuição, por que o valor cresce.

Ver resposta

✓ Resposta: Exemplo:

int contador = 0;
contador = contador + 1;
Console.WriteLine(contador);   // 1
contador = contador + 1;
Console.WriteLine(contador);   // 2
contador = contador + 1;
Console.WriteLine(contador);   // 3

A saída é 1, 2, 3. O valor cresce porque, a cada contador = contador + 1, o lado direito é calculado usando o valor atual de contador e somando 1, e o resultado é guardado de volta na mesma variável — então cada execução parte do valor anterior e o incrementa em um.

Exercício 4

Explique, com suas palavras, por que o sinal = em programação não significa "é igual a" no sentido matemático. Ilustre com a instrução x = x + 1, mostrando por que ela seria absurda como equação, mas faz sentido como atribuição.

Ver resposta

✓ Resposta: Em programação, = significa "guarde na variável à esquerda o valor calculado à direita", não "os dois lados são iguais". Em x = x + 1, se lido como equação matemática ("x é igual a x mais um"), seria absurdo, pois nenhum número é igual a ele mesmo mais um. Como atribuição, faz todo sentido: calcula-se o lado direito usando o valor atual de x (por exemplo, se x vale 5, x + 1 é 6) e guarda-se esse resultado em x, que passa a valer 6. A seta vai da direita para a esquerda.

Exercício 5

Para cada nome de variável a seguir, diga se é válido (segue as regras) e se é bom (segue as convenções), justificando: 2preco, preco total, precoTotal, x, _contador, int. Corrija os inválidos.

Ver resposta

✓ Resposta: Análise: 2preco — inválido (não pode começar com número); correção possível: preco2. preco total — inválido (não pode conter espaço); correção: precoTotal. precoTotal — válido e bom (descritivo, em camelCase). x — válido, mas ruim (não é descritivo; obriga a adivinhar o propósito). _contador — válido (o sublinhado é permitido, inclusive no início) e aceitável, embora contador seja mais comum para uma variável local. int — inválido (é uma palavra reservada da linguagem, com significado próprio); correção: usar outro nome, como numeroInteiro.

Comentários

Mais em Linguagem C#

Do PostgreSQL ao MySQL: a Mesma Aplicação, Outro Banco
Do PostgreSQL ao MySQL: a Mesma Aplicação, Outro Banco

A mesma aplicação migrada do PostgreSQL para o MySQL trocando apenas o…

Recursos Modernos: Pattern Matching, Tuplas e Records
Recursos Modernos: Pattern Matching, Tuplas e Records

Três recursos do C# moderno que encurtam o código do dia a dia: o pattern…

A Ferramenta dotnet e o NuGet
A Ferramenta dotnet e o NuGet

As ferramentas do ofício: o comando dotnet, que cria, compila, executa e testa…