24.07.2015, 15:01
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.
Isso entгo й uma falha da linguagem? Nгo necessariamente.
PHP й dinamicamente tipado, ou seja, vocк pode fazer este tipo de coisa:
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:
*: Caso a string comece por um inteiro, algo como 2Dolby, seu valor do casting implicito para inteiro, seja 2.
Faзa o teste:
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.
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.
Espero que tenha sido ъtil.
Abraзos.
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
PHP й dinamicamente tipado, ou seja, vocк pode fazer este tipo de coisa:
PHP код:
$oi = "Teste";
$oi = 1450;
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 == 0) // E como citei, se vocк converter *QUALQUER* string para inteiro, ela assume o valor 0(start point, digamos assim).
Faзa o teste:
PHP код:
if("Dolby" == 0) echo "Dolby Verdadeiro";
if("2Dolby" == 0) echo "2Dolby Verdadeiro"; // Essa condicional serб falsa
PHP код:
if('1' == 1) //Verdadeiro
if('1' === 1) //Falso
E como burlar isto? Trate os valores, como floats, assim como foi citado pelo Leonardo.
PHP код:
printf("Float: %f", float(60)/float(50));
Abraзos.