[Rio-pm] Chaves de hash

thiagoglauco em ticursos.net thiagoglauco em ticursos.net
Sexta Novembro 30 04:13:27 PST 2012


> Eu devo ser muito estúpido... mas alguém que está falando isso (ja é
> o 3o), poderia fazer o favor de me explicar porque ele deve usar && 
> no
> lugar do 'and' e qual diferença isso faz no caso deste if específico?
> E em quais situações deve-se usar o 'and' no lugar de &&?

Não é estúpido não. Vamos analisar a tabela da verdade da função and ou 
&&:

0 x 0 = 0
0 x 1 = 0
1 x 0 = 0
1 x 1 = 1

Então, no if do código do nosso biólogo não haveria impacto real, sorry 
eu me deixei levar por outras coisas que estava pensando aqui.

Mas voltando ao if:
if($keys >= $min and $keys <= $max)

O operador de short circuit só avaliaria a expresssão da direita ($keys 
<= $max) se a primeira expressão for verdadeira. Ou seja, se $keys for 
menor que $min o Perl nem vai perder tempo checando pois 0 x N = 0. 
Então aqui eu me enganei, não ia fazer diferença no código do nosso 
colega.

Por outro lado, vamos supor um caso que você queira aproveitar o teste 
if e executar duas subs na mesma linha de código:

if ( &foo and &bar ){
    ...faça alguma coisa
}
else {
    ... &bar só será executada se &foo retornar true
}

por outro lado:

if ( &foo && &bar ){
    ...&foo e &bar foram executadas. faça alguma coisa
}
else {
    ... &foo e &bar foram executadas mesmo com o && retornando false.
}

essa é a diferença.

Em 2012-11-29 22:09, Bruno Buss escreveu:
> 2012/11/29 <thiagoglauco em ticursos.net>
>
>> Seu primeiro erro é o operador and. No documento perlop: $ perldoc 
>> perlop você vai descobrir o seguinte:
>>
>>  " Logical And
>>      Binary "and" returns the logical conjunction of the two
>>      surrounding expressions.  It's equivalent to && except for
>>      the very low precedence.  This means that it short-circuits:
>>      i.e., the right expression is evaluated only if the left
>>      expression is true.
>> [...]
>>   C-style Logical And
>>      Binary "&&" performs a short-circuit logical AND operation.
>>      That is, if the left operand is false, the right operand is
>>      not even evaluated.  Scalar or list context propagates down
>>      to the right operand if it is evaluated."
>>
>> Logo, seu código
>>
>> if($keys >= $min and $keys <= $max){
>>
>> deveria ser if($keys >= $min && $keys <= $max){
>
> Eu devo ser muito estúpido... mas alguém que está falando isso (ja é
> o 3o), poderia fazer o favor de me explicar porque ele deve usar && 
> no
> lugar do 'and' e qual diferença isso faz no caso deste if específico?
> E em quais situações deve-se usar o 'and' no lugar de &&?
>
> [ ]'s--
> Bruno C. Buss
> http://www.brunobuss.net [1]
>
>
> Links:
> ------
> [1] http://www.brunobuss.net
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm



Mais detalhes sobre a lista de discussão Rio-pm