Ir para conteúdo
Fórum Script Brasil
  • 0

Dúvida: declaração de variáveis


Edu_Reis93

Pergunta

Fala galera, tudo certo?
Estou começando agora em programação C e estou lendo um livro para reforçar o conhecimento;
durante as explicações do autor deste livro vi uma declaração de variáveis que me deixou em dúvida de como o compilador iria interpretar essas informações
e quando seria válido usar a declaração desta forma (e vou dizer que achei bem estranha a forma como foi declarada :P)
O autor utilizou dados int declarados como char para fazer cálculos no seguinte formato:

char t=5, b=4;
char y;

void main(){
y = t+b;
}

Isso é comum? Se for, quando devo declarar números desta forma?
Grato!!

Editado por Edu_Reis93
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Acho que o livro que você está lendo parece algo desatualizado, void main não é muito recomendável atualmente, certamente com compiladores mais modernos podem mostrar avisos.

Sobre sua pergunta posso lhe dizer que sim é possível efetuar operações aritméticas sobre praticamente qualquer tipo de dados básicos como float, int, char, etc. No caso de chars pode parecer algo descabelado, porem tem uma explicação, a causa é por conta da tabela asc2.

Na tabela asc2 cada letra tem um valor decimal atribuído, no seu exemplo, t=5 quer dizer que t é igual ao caractere não imprimível ENQ, que em outras palavras é um caractere de "consulta", não sei realmente o que faz esse caractere, só sei que quando você faz char t = 5; quer dizer que você quer pegar o caractere numero 6... ele é o seis porque começa a contar de zero(zero, um, dois, três, quatro e cinco = 6), e você joga ele na variável t que é do tipo char, então ele vai tomar o caractere ENQ, em outras palavras, vamos ver um exemplo com o caractere 'a'. Se declaro uma variável tipo char e a chamo de t(char t;) se logo depois eu pegar e jogar o valor em decimal que corresponde ao 'a', t vai tomar a letra 'a', porque como falei antes, trata-se de um char. Veja o exemplo:
char t = 97; // t recebeu 'a' por que é do tipo char. 97 corresponde a 'a' na tabela asc2
int    t= 'a';  // t recebeu 97 porque é do tipo int. Recebeu 97 porque trata-se de uma variavel inteira, ela guarda valores e não letras, ela guardou o valor em decimal da letra 'a' conforme a tabela asc2.

char t = 97+1; // t vai receber 'b', pois 97+1 é 98, e 98 na tabela asc2 corresponde a 'b'.
int t = 'a'+'b'; // t vai receber 195 pois t é do tipo int, por isso receberá somente inteiros. Receberá o valor somado da tabela asc2 correspondente a 'a' + 'b' (97+98) equivale a int t = 97+98 ;

Acho que ficou claro... se eu tiver uma variável do tipo char vamos recebe letras, si efetuamos uma operação de soma, receberemos letras porem em base a ordem que vai de 0 a 255 em decimal, é como si somamos "posições", se a variável fosse do tipo int então recebo valores esses valores em decimal(0 a 255), por isso se pode aplicar operações básicas ao tipo char, porque se aplica a esses valores decimais que na realidade estão marcando a posição das letras. Eu posso somar 97+97 ou 'a' + 'a', o que você deve ter em conta é o tipo da variavel que vai ser "jogado" o resultado, se for um int só guarda números, se for char só guarda letras, mas tudo vai em base desses valores de 0 a 255 que representa as posiçoes de cada letra na tabela. Essa tabela é muito importante na programação, guarde ela.

Agora que aconteceria se somo 255+1? voltamos ao zero! Em outras palavras, 255+1 é igual a zero, zero representa NULL na tabela, pois se estou na ultima letra e somo um volto ao principio pois não existe 256, eu falei antes que só temos de 0 a 255, porem imagine que é algo como isso     0, 1, 2, 3.........253, 254, 255, 0 <-voltamos a zero si passamos de 255, é como se fosse um bucle. Vamos ver algo de código:

#include <stdio.h>

int main (){
    char t = 255+1; //
    
    if (t == NULL)//se t é igual a NULL mostra "NULL" na tela
        printf("NULL");
    else
        printf("não é null");
    return ;
}

Como você pode ver se somo a ultima letra da tabela que é a 255 com 1 volto ao principio, ou seja zero, dai vai mostrar o mensagem "NULL", ou mostra "Não é Null" se troco o 255+1 por qualquer outros valores. se ponho char t = 800 é como se eu passa-se 3 vezes por zero,  0, 1, 2, 3...253, 254, 255, 0, 1, 2, 3...253, 254, 255, 0, 1, 2, 3...253, 254, 255, 0..., nunca saímos desses 0 a 255, algo semelhante acontece com todos os tipos de variáveis, você só pode representar uma "margem" de valores de x a z valores. veja isso para entender: http://1.bp.blogspot.com/-_s9g4AGdR7Q/Tz0s3bFJxII/AAAAAAAAAGE/tG8jGzF4Rro/s1600/Tipos+de+dados(C++).png


A mesma coisa acontece ao contrario, se a 0 resto 1 então vai mostrar o caractere 255 porem para isso devo usar um cast a unsigned char na hora de imprimir para mostrar corretamente já que se imprimimos um char como int(%d) mostraria resultados negativos. Veja o exemplo seguinte:

#include <stdio.h>

int main (){
    char t =  - 1; 
    
    printf("%d", (unsigned char)t );
    
    return ;
}

É algo complicado ao principio porem não é nada de outro mundo. com cada tipo de variável você pode representar X valores dependendo do tipo de dado que você escolheu. O tipo de dados depende da sua necessidade, com um short int eu tenho menos valores possíveis, se preciso de mais dados necessito um int o inclusive algo maior como um long ou long long int, mas a maior é a variável, maior é a memória que ocupa, não tem cabimento você usar long int que permite números de -2.147.483.648 a 2.147.483.647 para guardar uma idade, com um short int bastaria, e com ele podemos guardar -32.768 a 32.767, e sinceramente não conheço ninguém com a idade de 32.767 anos, você até poderia usar um char para guardar a idade, com ele você poderia guardar de 0 a 255 valores. você conhece alguém com 255 anos? >_< Bastaria tratar esse char como se fosse int fazendo seus devidos casts. Claro que para uma só idade é uma estúpido usar char, mas pense se você fosse guardar a idade de todas as pessoas do planeta.... se você usar char para isso você gasta 4 vezes menos memória que com int. imagina você trabalhar para google ou facebook e você desperdiçar memória assim, certamente você irá para o olho da rua hahaHAHAH.

já cansei>_<. Faça leituras no google sobre "tipos de dados em C", "tabela ascii", "conversões de tipo em C(casts)", "especificadores de formato printf/scanf" entre outros assuntos, veja videos também em YouTube, se uma imagem vale mais que mil palavras, um vídeo vale mais que mil imagens >_<.

Fui!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...