Compreendendo tipos de dados C, conversão e estruturas

9

C é rigoroso quanto ao que contém na memória. Não adivinha. Você precisa dizer exatamente que tipo de dados está armazenando. Isto não é apenas pedantismo. Afeta o modo como o programa é executado, a quantidade de memória que ele usa e se os cálculos saem corretos ou são lixo.

Os tipos de variáveis padrão

Existem três tipos de variáveis padrão em C.

Inteiro: int
Este é um número inteiro de 4 bytes. Ele lida com números inteiros.

Ponto flutuante: float
Este é um valor de ponto flutuante de 4 bytes. Ele lida com decimais.

Personagem: char
Este é um caractere único de 1 byte. Pense em “a” ou “3”. Uma string em C é apenas um array desses caracteres.

Depois, há tipos de derivativos. Você os usa quando os três padrões não funcionam.

  • double : Um valor de ponto flutuante de 8 bytes. Mais precisão.
  • short : Um número inteiro de 2 bytes. Menos memória, menos alcance.
  • unsigned short ou unsigned int : Estes lidam apenas com números inteiros positivos. Nenhum sinal. Se você precisar rastrear contagens populacionais ou tamanhos de pacotes, esta geralmente é a escolha certa.

Operadores e precedência de operadores

Os operadores em C parecem familiares.

  • + adição
  • - subtração
  • / divisão
  • * multiplicação
  • mod %

Mas cuidado com a divisão. O operador / executa a divisão inteira se ambos os operandos forem inteiros. Caso contrário, ele executa a divisão de ponto flutuante.

Veja este código:

Ele imprime um valor de ponto flutuante porque a é declarado como tipo float. Mas a será 3,0. Por que? Porque o código executou a divisão inteira primeiro. 10 dividido por 3 é 3. O resultado é 3. Então esse 3 é convertido em 3,0 quando armazenado em a. A precisão foi perdida antes mesmo de atingir a variável.

A precedência do operador em C segue regras padrão. A divisão e a multiplicação acontecem antes da adição e da subtração.

O resultado de 5+3*4 é 17. Não 32. O operador * tem precedência maior que +. Você pode substituir isso por parênteses. (5+3)*4 é 32. O 5+3 é avaliado primeiro.

A precedência fica confusa mais tarde. Depois que os ponteiros entram no bate-papo, fica complicado. Mas por enquanto, lembre-se: multiplique e divida antes de somar e subtrair.

Tipografia

C permite converter tipos dinamicamente. Você faz isso frequentemente com dicas. Também acontece automaticamente durante a atribuição para determinados tipos.

No exemplo acima, o resultado inteiro de 10/3 foi automaticamente convertido em float. Mas e se você quisesse o decimal?

Você faz a conversão de tipo colocando o nome do tipo entre parênteses antes do valor.

Substitua a=10/3; por a=(float)10/3;.

Agora a é 3,33333. O 10 é convertido em um valor de ponto flutuante antes da divisão. A divisão acontece em terrenos de ponto flutuante. O resultado mantém suas casas decimais.

Typedef

Você pode declarar tipos nomeados e definidos pelo usuário em C com a instrução typedef. Isso é comum no código C.

Isso permite declarar tipos booleanos. C não possui um tipo nativo bool em padrões mais antigos, então esta é uma solução alternativa.

Se você não gosta da palavra “float”, você pode dizer:

Então mais tarde:

Coloque instruções typedef em qualquer lugar do programa. Apenas certifique-se de que eles venham antes do primeiro uso.

Estruturas

Estruturas em C agrupam variáveis em um pacote.

Sempre que você quiser declarar estruturas do tipo rec, você deve dizer struct rec. Isso é fácil de esquecer. Você receberá erros do compilador se deixar de fora a struct.

Você pode compactar o código:

Aqui, a declaração do tipo e a variável r são declaradas na mesma instrução.

Ou use typedef para o nome da estrutura. Se você odeia digitar struct rec r toda vez:

Em seguida, declare os registros dizendo:

Acesse campos usando um ponto final. r.a = 5;.

Matrizes

Você declara arrays inserindo um tamanho após a declaração normal.

Matrizes são blocos contíguos de memória. Acessar um índice fora dos limites é um comportamento indefinido. Pode falhar. Pode corromper dados. Pode parecer funcionar até que não funcione.

Incrementando

C possui atalhos para operações comuns.

  • i = i + 1; torna-se i++;
  • i = i - 1; torna-se i--;
  • i = i + 3; torna-se i += 3;
  • i = i * j; torna-se i *= j;

Estes não são apenas açúcar sintático. Eles geralmente compilam em código de máquina mais eficiente. Use-os.

Erros C a serem evitados

O operador / com dois inteiros é uma armadilha. Ele trunca a parte decimal. Sempre verifique seus tipos antes de dividir. Se você precisar de precisão, converta um operando para float ou double primeiro.

Pense nisso sempre que usá-lo. Caso contrário, seus números estarão errados. E depurar problemas de divisão inteira é doloroso.

Experimente isto

  • Experimente a digitação. Tente int, char, float. Veja o que acontece quando você os mistura.
  • Crie uma matriz de registros. Escreva o código para classificar essa matriz em um campo inteiro. Ele ensina sobre ponteiros, layout de memória e fluxo de controle.

Os detalhes são importantes em C. Se perder um tipo, todo o programa será interrompido. Faça certo e ele correrá rápido.