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

While - Loop Infinito


plus

Pergunta

3 respostass a esta questão

Posts Recomendados

  • 0

isso é devido a alinhamento dos bytes. quando você tem um float f = 1.0 e tenta comparar if ( f == 1.0 ) você está fazendo uma comparação entre um float e um double literal. Para isso funcionar você deveria tratar float como float, para por um exemplo do que falo coisas como float f = 1.0f; são importantes pois você está atribuindo um double a um float quando você faz coisas como float f =1.0;. Quando usamos a notação 1.0 o compilador toma isso como um double, da certo ao atribuilo a um float por que seu programa sabe que você quer atribuir 1.0 a um float e o que acontece nesse caso é uma conversão de tipos implicita, ou seja, não transparente ao programador. Para solucionar esse "problema" você precisa indicar ao compilador que trata-se de que você quer comparar um float com outro float, isso podemos faze-lo de duas formas mas pode que alguma falhe ainda assim, a primeira e que menos recomendo é if ( f == 1.0f ), que ainda assim pode falhar, e a segunda forma que é para mim a melhor, é indicar ao compilador que se trata de um float e não de um double através de uma conversão explicita tipo if ( f==(float)1.1). 

Vamos ver mais casos:
float f = 1.0; //atribuição de um double a um float, acontece uma conversão(CAST) implícita.

if ( f == 1.0 ) // comparação entre float e double
if ( f == 1.0f) //comparação entre 2 float, porem não são exatos por razões que desconheço e podem falhar.
if ( f == (float)1.0) //Esse sim me funciona perfeito. Nos indicamos ao compilador explicitamente que 1.0 se trata de um float literal

f = 1; //atribuímos um int literal a um float, acontece a conversão de tipos internamente de forma não transparente(implicitamente).

int i = 1.1f; // atribuímos um float literal a um int, como o int não permite armazenar números flotantes acontece uma conversão interna, nesse caso o float perde as partes decimais.

int i = "Alo mundo";
Este ultimo caso parece descabelado mas é perfeitamente possível! A string "Alo Mundo" retorna um ponteiro! então se imprimir a i com printf você verá im inteiro, esse inteiro nada mais é que a direção da memória onde esta guardado a literal de string "Alo mundo". Se atribuímos o valor de i a um ponteiro do tipo char podemos imprimir essa variável.
Exemplo:
    int i = "Alo mundo";
    char *p = i;
    printf("%s", p);

Neste caso o compilador vai tirar warnings porque tentamos fazer algo descabelado, mas isso poderia ter aplicações. Os avisos desapareceriam com fazer uma conversão de tipos de string a int da seguinte forma:
int i = (int)"Alo mundo";
O compilador não se está queixando de que você está atribuindo um string a um int, ele somente te avisa que se você quer fazer isso que ao menos indique com um cast que é sinal de que você sabe perfeitamente o que está fazendo.

Assim que não ache descabelado fazer coisas como:
float f = (float)1.1;
double d = (double)1.1; // neste caso não precisa porque sempre que não for float será double >_<
char* p = (char*)"Alo mundo";

Algumas vezes o compilador vai dar avisos, outras não... por exemplo, seria muito chato se cada momento que nós queiramos fazer algo como float f = 1.1 e tirasse um aviso tipo "atribuição de um double a um float sem cast explicito" seria muito chato não é.

Bom... busque mais sobre conversões de tipos em C e literais em C. alguns casos podem ser: https://msdn.microsoft.com/pt-br/library/c70dax92.aspx

e
https://msdn.microsoft.com/pt-br/library/8kc54dd5.aspx
 

O que são literais?  Tudo o que não for uma variável.

tipo: 1.1, "Ola mundo", (int)3.14, PI São literais por que escrevemos elas no arquivo de código fonte.

As variáveis vão armazenadas na memória.

Se aprender a depurar seu código poderia ver essas coisas:
#Captura.JPG

 

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...