plus Postado Novembro 17, 2016 Denunciar Share Postado Novembro 17, 2016 Ola, comecei a aprender programação esse ano, e tem um código, mostrado abaixo, no qual é criado um loop infinito, e não sei o porque, alguém poderia ajudar?? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 vangodp Postado Novembro 18, 2016 Denunciar Share Postado Novembro 18, 2016 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 ehttps://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: Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Exata0mente Postado Novembro 18, 2016 Denunciar Share Postado Novembro 18, 2016 Cara, eu sou seu fã! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 vangodp Postado Novembro 18, 2016 Denunciar Share Postado Novembro 18, 2016 (editado) 5 horas atrás, Exata0mente disse: Cara, eu sou seu fã! por quê? kkk Editado Novembro 18, 2016 por vangodp Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
plus
Ola, comecei a aprender programação esse ano, e tem um código, mostrado abaixo, no qual é criado um loop infinito, e não sei o porque, alguém poderia ajudar??
Link para o comentário
Compartilhar em outros sites
3 respostass a esta questão
Posts Recomendados
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.