Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diogo Lanna

operador logico

Recommended Posts

$a = true or false;
var_dump($a);
// saida true

$a = false or true;
var_dump($a);
// saida false

$a = true || false;
var_dump($a);
// saida true

$a = false || true;
var_dump($a);
// saida true

consultando um amigo da ciencia da computação ele disse que o pipe (||) como sendo operador bit a bit apresenta resultado certo mas que o OR nao sabia explicar ....

 

acho que é simplesmente a sintaxe do OR que tem que estar atribuida em uma cadeia IF ...

 

entao, alguem se habilita ??

Compartilhar este post


Link para o post
Compartilhar em outros sites

No PHP um pipe apenas '|' é um operador bit a bit. Dois pipes '||' é um operador lógico, o 'OR'.

Sobre operadores: http://br.php.net/manual/pt_BR/language.operators.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que entendi, o iogo Lanna quer saber por que esta parte do código retorna FALSE:

$a = false or true;
var_dump($a);
// saida false

Também achei estranho, uma vez que isso deveria equivaler a false || true, que retornou TRUE.

 

:unsure:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que entendi, o iogo Lanna quer saber por que esta parte do código retorna FALSE:

$a = false or true;
var_dump($a);
// saida false

Também achei estranho, uma vez que isso deveria equivaler a false || true, que retornou TRUE.

 

:unsure:

exatamente !!!!!!!

 

desculpa galera, realmente nao fui muito explícito no que queria ...

 

essa é a duvida, teoricamente || e OR deveriam agir da mesma forma, entao ambos retornariam TRUE ... o que nao e o caso da segunda opção do codigo lá em cima ....

 

 

e complementando la em cima, quando disse atribuido em uma cadeia de ifs, quis dizer o seguinte, o OR me parece ser feito pra ser utilizado com outros operadores logicos, coisa do tipo

 

if( $a ==1 or $a==2)
		  echo $a;

e quem me revelou esse problema (o cara é certificado pela ZEND), tb disse que esse tipo de expressao:

 

mysql_connect (x,x,x) or die('nao foi possivel conectar')

so é possivel por causa desse 'bug' do OR, essa eu ainda nao tive tempo de analizar por falta de tempo, mas a principio faz sentido ....

 

 

lembrei de outra tb, mas e so pra curiosidade, pq o problema é de outro nivel .....

 

qual o resultado para:

 

$b = (0.1 + 0.7)*10;
echo floor($b);

??????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segundo o manual do PHP, a diferença do "OR" e do "||' é a precedência, com o "||" tendo uma maior precedência que o "OR"...

 

Desta forma, caso você deseje que seja feita a operação lógica e em seguida a atribuição do resultado desta operação a uma variável, você deve fazer assim:

 

$var = false || true; #retorna true, pois $var recebe (false || true), o que é verdadeiro

Agora caso use:

$var = false OR true; #retorna false, pois $var recebe somente o false, já que o "=" tem maior precedência sobre o "OR"

Esta é a diferença entre eles, a precedência...

 

Portanto, caso queira que o 2º exemplo tenha o mesmo efeito que o primeiro basta "cercar" a expressão lógica com parênteses, assim ela é executada antes da atribuição à variável, já que os parênteses tem maior precedência que o "=" (atribuição)!

 

Sacaram?

 

Quanto ao floor(), eu realmente não sei explicar com minhas palavras o que realmente ocorre, mas é algum lance interno do PHP em relação à representação de números float...

Lendo o manual eles falam que o número float 8.0, é representado internamente como 7.9999999999999, o que faz sentido retornar 7 na expressão que você passou.

 

Dê uma lida no manual que dá pra entender melhor: http://br.php.net/float

Compartilhar este post


Link para o post
Compartilhar em outros sites

a explicação da precendencia do '=' ser maior que o 'or' é plausivel ...

 

vou dar uma olhada nisso depois, com testes e etc...

 

agora sobre o resultado ser 7, aqui vai a explicação ....

 

nao é problema interno do php, e problema computacional mesmo ...

 

computadores nao sabem lidar com frações, entao trabalha por aproximação usando 'mesmo' o metodo de trabalho dos inteiros né:

 

2^31 + 2^30 + ..... 2^0

 

so que como denominador:

 

1/2^31 + 1/2^30 + ..... 1/2^1

 

e para por aí pq 1/2^0 é 1, o que não pode acontecer ...

 

entao, somando isso td teremos 0,9999999......xxxxxx. Por isso quanto maios a quantidade de bits de uma maquina, maior a precisao pq aquela sequencia começaria com 1/2^63 +.......

 

e mesmo que seja usado milhoes de bits nao vai conseguir precisão nunca, pq nao tem como representar 0,999999999999999999999999 infinitamente...

 

é isso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hehehehe assim que é legal, fez a galera correr atrás!

Só assim se aprende direito, botando a mão na massa e o cérebro para funcionar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.