Neste vídeo, falaremos sobre variáveis e tipos.
Variáveis e tipos
O que são variáveis?
Para começarmos a discutir sobre variáveis e tipos, é essencial entender o que são variáveis.
As variáveis são uma forma de indicarmos à linguagem de programação utilizada que desejamos armazenar algum dado na memória.
Por exemplo: trabalhando em um sistema de estoques de produtos, queremos um programa que armazene o valor do estoque, ou seja, a quantidade de produtos. Essa quantidade será atualizada ao longo do tempo, pois podemos retirar ou repor produtos. Portanto, ao armazenar essas informações, é útil trabalhar com variáveis.
Exemplo de uso de variáveis
Abaixo, temos um exemplo de como poderíamos utilizar uma variável para representar a quantidade de produtos. Nesse caso, definimos um int quantidadeDeProdutos que recebe o valor 42, indicando que o estoque possui 42 produtos.
int quantidadeProdutos = 42;
Quais são as vantagens das variáveis?
A vantagem de trabalharmos com variáveis é a seguinte: o computador entende apenas números, então podemos instruí-lo a armazenar um dado na memória. Com isso, ele nos fornecerá um endereço, como 934587, por exemplo, para armazenar esse dado.
No entanto, para nós, seres humanos, é difícil memorizar endereços numéricos. É mais fácil trabalharmos com nomes. A linguagem de programação faz a ponte entre nós e o computador, permitindo nomear variáveis e endereços de memória.
Representação de memória
A tabela abaixo representa uma memória com vários endereços. No endereço 121, temos a quantidadeDeProdutos, que armazena o tipo int e o valor 42.
Memória:
| Endereço | Variável | Conteúdo |
|---|
| 119 | - | - |
| 120 | - | - |
| 121 | int QuantidadeProdutos | 42 |
| 122 | - | - |
| 123 | - | - |
Essa ponte é feita pela linguagem de programação, que, no nosso caso, é o C♯.
Sintaxe de declaração de variáveis
Para trabalhar com variáveis em C♯, seguimos um padrão, ou sintaxe, para declarar essas variáveis. Nessa sintaxe, sempre temos um tipo de variável no começo, seguido pelo nome da variável, o operador de atribuição = e, por fim, o dado que queremos armazenar na memória.
tipo nomeVariavel = dado;
Conhecendo os tipos de dados
Existem dois grupos de tipos de dados:
- Os tipos primitivos;
- E os tipos referenciados.
Os tipos primitivos são disponibilizados por padrão na linguagem. Se quisermos escrever nosso primeiro programa, por exemplo, podemos utilizar tipos primitivos.
Já os tipos referenciados são aqueles que criamos, geralmente usando classes. Vamos entender melhor os tipos referenciados ao trabalharmos com orientação a objetos.
Por enquanto, vamos focar nos tipos primitivos.
Tipos primitivos
Quando falamos em tipos primitivos, existem vários disponíveis. Abaixo, trouxemos uma tabela contendo alguns desses tipos e exemplos:
| Tipo | Valores possíveis | Exemplo |
|---|
bool | true ou false | bool ativo = true; |
char | caracteres unicode | char inicial = 'A'; |
byte | 0 a 255 | byte idade = 25; |
sbyte | -128 a 127 | sbyte temperatura = -5; |
short | -32.768 a 32.767 | short numeroCurto = 1000; |
ushort | 0 a 65.535 | ushort codigoProduto = 500; |
int | -2.147.483.648 a 2.147.483.647 | int contador = 100; |
uint | 0 a 4.294.967.295 | uint populacao = 50000; |
long | -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 | long distancia = 1000000000; |
ulong | 0 a 18.446.744.073.709.551.615 | ulong estrelas = 9999999999; |
float | ±1,5 × 10⁻⁴⁵ a ±3,4 × 10³⁸ | float altura = 1.75f; |
double | ±5,0 × 10⁻³²⁴ a ±1,7 × 10³⁰⁸ | double peso = 72.5; |
decimal | ±1,0 × 10⁻²⁸ a ±7,9 × 10²⁸ | decimal preco = 199.99m; |
Podemos ter o bool, para valores booleanos (true ou false). Também temos o tipo char, para tratar caracteres. Se quisermos armazenar um único caractere unicode, podemos usar o tipo char.
Além disso, existem vários tipos numéricos. Para números inteiros, temos byte, sbyte, short, ushort, int, uint, long e ulong. A diferença entre eles está nos intervalos que armazenam.
Por exemplo: o byte armazena valores de 0 a 255, enquanto o long armazena um número extremamente grande. Cada tipo pode ter intervalos diferentes.
Quanto maior o intervalo que um tipo pode representar, maior é o espaço alocado na memória. Portanto, é importante escolher bem o tipo que será usado.
Alocar uma variável do tipo long para representar, por exemplo, o número 10, que poderia ser facilmente representado por um byte, não é eficiente.
É essencial sempre conhecer o nosso problema para propor uma solução que consuma menos memória, evitando problemas desse tipo.
Além dos tipos inteiros, também temos os tipos de ponto flutuante float, double e decimal. Pontos flutuantes são números com vírgula, ou seja, números com casas decimais.
A diferença entre esses tipos está na precisão. O float é o tipo com menor precisão, enquanto o decimal é o tipo com a maior precisão possível ao representar números. Já o tipo decimal é frequentemente utilizado em cálculos financeiros para maior precisão, evitando prejuízo. É importante conhecer cada caso para escolher o tipo mais adequado.
Strings e tipos referenciados
Uma observação interessante sobre os tipos primitivos é que as strings não estão incluídas entre eles. Embora utilizemos string desde os programas mais básicos, elas são um tipo referenciado. Vamos explorar mais sobre strings em outro curso; o foco agora serão os tipos primitivos.
Praticando no Visual Studio
Agora, vamos praticar no Visual Studio. Podemos começar declarando no arquivo Program.cs a variável mencionada como exemplo anteriormente.
Nesse caso, precisamos declarar um int quantidadeProdutos recebendo 42.
Program.cs:
int quantidadeProdutos = 42;
Note que a variável quantidadeProdutos está escrita em camel case, onde a primeira palavra é iniciada em minúsculo e a segunda em maiúsculo. Esse padrão é utilizado quando temos várias palavras compondo o nome das variáveis.
Declaração e inicialização de variáveis
Ao falarmos sobre declaração de variáveis, é importante entender a diferença entre declaração e inicialização. No exemplo acima, temos a declaração e a inicialização juntas, mas elas podem ser separadas. Para isso, basta declarar uma variável int chamada quantidade, por exemplo.
int quantidadeProdutos = 42;
int quantidade;
Isso indica ao compilador que deve reservar um espaço na memória, mas esse espaço não está preenchido até fazermos uma atribuição, como quantidade = 42.
int quantidade;
quantidade = 42;
Inferência de tipos com var
Conhecer a diferença entre inicialização e atribuição é essencial. Precisamos sempre de um tipo, o nome e o dado. O C# tem como recurso a palavra-chave var, que não é um tipo, mas indica ao C# que ele deve inferir o tipo da variável.
Por exemplo: ao declarar var letra = 'A', o compilador infere que letra é do tipo char, pois a variável foi declarada e inicializada na mesma linha.
int quantidade;
quantidade = 42;
var letra = 'A';
Observação: se removêssemos a atribuição, isto é, o trecho = 'A', o compilador reclamaria um erro no código, pois precisa dela para entender o tipo.
Operadores aritméticos
Vamos discutir outros aspectos dos tipos primitivos? Em relação aos tipos numéricos, é importante conhecer os operadores aritméticos, como adição, subtração, multiplicação, divisão e módulo.
| Operador | Significado | Exemplo | Resultado |
|---|
+ | Adição | 5 + 3 | 8 |
- | Subtração | 10 - 4 | 6 |
* | Multiplicação | 6 * 2 | 12 |
/ | Divisão | 10 / 2 | 5 |
% | Módulo (resto da divisão) | 10 % 3 | 1 |
++ | Incremento (+1) | int x = 5; x++; | x = 6 |
-- | Decremento (-1) | int y =8; y--; | y = 7 |
Por exemplo, 10 % 3 resulta em 1. Esse operador aritmético é útil para determinar se um número é par ou ímpar. Além disso, temos o incremento (++) e o decremento (--). O incremento adiciona 1 à variável, enquanto o decremento subtrai 1.
Simulando no código
Com os operadores aritméticos em mente, podemos simular no código.
No momento, temos a variável quantidadeProdutos recebendo o valor 42. Podemos imprimir essa variável com Console.WriteLine() para verificar o que acontece.
var letra = 'A';
Console.WriteLine(quantidadeProdutos);
Feito isso, logo abaixo, chamaremos a variável quantidadeProdutos seguida do operador aritmético ++, para incremento. Por fim, vamos imprimi-la novamente.
Console.WriteLine(quantidadeProdutos);
quantidadeProdutos++;
Console.WriteLine(quantidadeProdutos);
Ao executar o código, o resultado inicial no terminal é 42, e após o incremento, 43. Assim, aprendemos como funciona o operador de incremento.
Conclusão
Nos encontramos no próximo vídeo, onde falaremos sobre conversão de tipos!