[Ajuda] Pawn com problemas na divisгo?
#5

Esse й daquele tipo de tуpico que gosto de fazer uma daquelas fodendo explicaзхes, entгo vamos lб.

Vou usar como exemplo, uma possнvel "falha" do PHP que geralmente os que realmente nгo entendem o processo de tipagem de dados dinвmica dela costumam criticar, sendo que na verdade isso й uma falha dos mesmos.

Em PHP, se vocк comparar qualquer string com 0, o valor de retorno vai ser verdadeiro.
PHP код:
if("string" == 0// O valor dessa condicional sempre serб verdadeiro 
Isso entгo й uma falha da linguagem? Nгo necessariamente.

PHP й dinamicamente tipado, ou seja, vocк pode fazer este tipo de coisa:
PHP код:
$oi "Teste";
$oi 1450
Que o prуprio interpretador faz um type casting implнcito, a fim de transformar a variбvel em um dado inteiro.

Ok. E daн?

E daн, que quando vocк faz aquela comparaзгo de qualquer string com 0, o interpretador faz primeiro um type casting de string para inteiro antes de tudo, para depois uma possнvel atribuiзгo. E qual a melhor forma do interpretador fazer isto? Qual valor ele deve pre-inicializar para essa nova variбvel inteira? O valor 0.

Resumidamente, й basicamente assim:

PHP код:
if("Dolby" == 0//Primeiramente o interpretador precisa converter os dados para tipos inteiros
if(== 0// E como citei, se vocк converter *QUALQUER* string para inteiro, ela assume o valor 0(start point, digamos assim). 
*: Caso a string comece por um inteiro, algo como 2Dolby, seu valor do casting implicito para inteiro, seja 2.

Faзa o teste:

PHP код:
if("Dolby" == 0) echo "Dolby Verdadeiro";
if(
"2Dolby" == 0) echo "2Dolby Verdadeiro"// Essa condicional serб falsa 
Exatamente por este motivo que o PHP tem um operador que leva em consideraзгo, o tipo de dado, chamado de strict equals ( === ). Sim, sгo 3 iguais.

PHP код:
if('1' == 1//Verdadeiro
if('1' === 1//Falso 
O que aconteceu no seu cуdigo foi exatamente isto. Vocк dividiu 60 por 1, que resultou em 60, no entanto, como utilizou o placeholder %f, vocк obrigou o compilador a fazer um type casting implнcito de inteiro para float , que como foi citado acima, assume o "start point", valor 0.


E como burlar isto? Trate os valores, como floats, assim como foi citado pelo Leonardo.

PHP код:
printf("Float: %f"float(60)/float(50)); 
Espero que tenha sido ъtil.

Abraзos.
Reply


Messages In This Thread
Pawn com problemas na divisгo? - by Juniiro3 - 23.07.2015, 23:20
Re: Pawn com problemas na divisгo? - by n0minal - 23.07.2015, 23:23
Re: Pawn com problemas na divisгo? - by Juniiro3 - 23.07.2015, 23:26
Re: Pawn com problemas na divisгo? - by n0minal - 24.07.2015, 00:04
Re: Pawn com problemas na divisгo? - by Dolby - 24.07.2015, 15:01
Re: Pawn com problemas na divisгo? - by Kimossab - 24.07.2015, 19:13

Forum Jump:


Users browsing this thread: 1 Guest(s)