Hi.<br><br>A diferença entre <b>&&</b> e <b>and</b> não é apenas a questão da precedência dos operadores?<br>Penso eu que essa questão não tenha nada a ver com <i>short-circuiting</i>, já que logicamente falando ambas fazem a mesma operação.<br>

<br>Exemplificando, quando temos:<br>use Data::Printer;<br>my $a = 1;<br>my $b = 0;<br><br>my $c = $a && $b;<br>my $d = $a and $b;<br>p $c;<br>p $d;<br><br>O valor de $c seria FALSE, mas o valor de $d seria TRUE.<br>

Isso, porque, pela precedência dos operadores, a última operação é a mesma coisa que:<br>(my $d = $a) and $b;<br><br>Deste modo, $d sempre resultará em TRUE, ignorando o $b.<br><br>Isto é, pelo menos é assim em outras linguagens e pelo que me parece, no Perl também.<br>

<br>[]'s<br><br><div class="gmail_quote">Em 4 de dezembro de 2012 14:00, Blabos de Blebe <span dir="ltr"><<a href="mailto:blabos@gmail.com" target="_blank">blabos@gmail.com</a>></span> escreveu:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Desculpa,<br>
<br>
Não entendi a diferença entre:<br>
<br>
perl -E 'sub a{say 1} sub b{say 2} if (a() && b()){}'<br>
perl -E 'sub a{say 1} sub b{say 2} if (a() and b()){}'<br>
<br>
perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() && b()){}'<br>
perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() and b()){}'<br>
<br>
Até onde eu sei, não existe operador de short circuit. O short circuit<br>
é uma propriedade, uma otimização na avaliação de expressões lógicas.<br>
<br>
Alguém estamos viajando?<br>
<br>
[]'s<br>
<br>
2012/11/30  <<a href="mailto:thiagoglauco@ticursos.net">thiagoglauco@ticursos.net</a>>:<br>
<div class="HOEnZb"><div class="h5">>> Eu devo ser muito estúpido... mas alguém que está falando isso (ja é<br>
>> o 3o), poderia fazer o favor de me explicar porque ele deve usar && no<br>
>> lugar do 'and' e qual diferença isso faz no caso deste if específico?<br>
>> E em quais situações deve-se usar o 'and' no lugar de &&?<br>
><br>
><br>
> Não é estúpido não. Vamos analisar a tabela da verdade da função and ou &&:<br>
><br>
> 0 x 0 = 0<br>
> 0 x 1 = 0<br>
> 1 x 0 = 0<br>
> 1 x 1 = 1<br>
><br>
> Então, no if do código do nosso biólogo não haveria impacto real, sorry eu<br>
> me deixei levar por outras coisas que estava pensando aqui.<br>
><br>
> Mas voltando ao if:<br>
><br>
> if($keys >= $min and $keys <= $max)<br>
><br>
> O operador de short circuit só avaliaria a expresssão da direita ($keys <=<br>
> $max) se a primeira expressão for verdadeira. Ou seja, se $keys for menor<br>
> que $min o Perl nem vai perder tempo checando pois 0 x N = 0. Então aqui eu<br>
> me enganei, não ia fazer diferença no código do nosso colega.<br>
><br>
> Por outro lado, vamos supor um caso que você queira aproveitar o teste if e<br>
> executar duas subs na mesma linha de código:<br>
><br>
> if ( &foo and &bar ){<br>
>    ...faça alguma coisa<br>
> }<br>
> else {<br>
>    ... &bar só será executada se &foo retornar true<br>
> }<br>
><br>
> por outro lado:<br>
><br>
> if ( &foo && &bar ){<br>
>    ...&foo e &bar foram executadas. faça alguma coisa<br>
> }<br>
> else {<br>
>    ... &foo e &bar foram executadas mesmo com o && retornando false.<br>
> }<br>
><br>
> essa é a diferença.<br>
><br>
> Em 2012-11-29 22:09, Bruno Buss escreveu:<br>
>><br>
>> 2012/11/29 <<a href="mailto:thiagoglauco@ticursos.net">thiagoglauco@ticursos.net</a>><br>
>><br>
>>> Seu primeiro erro é o operador and. No documento perlop: $ perldoc perlop<br>
>>> você vai descobrir o seguinte:<br>
>>><br>
>>>  " Logical And<br>
>>>      Binary "and" returns the logical conjunction of the two<br>
>>>      surrounding expressions.  It's equivalent to && except for<br>
>>>      the very low precedence.  This means that it short-circuits:<br>
>>>      i.e., the right expression is evaluated only if the left<br>
>>>      expression is true.<br>
>>> [...]<br>
>>>   C-style Logical And<br>
>>>      Binary "&&" performs a short-circuit logical AND operation.<br>
>>>      That is, if the left operand is false, the right operand is<br>
>>>      not even evaluated.  Scalar or list context propagates down<br>
>>>      to the right operand if it is evaluated."<br>
>>><br>
>>> Logo, seu código<br>
>>><br>
>>> if($keys >= $min and $keys <= $max){<br>
>>><br>
>>> deveria ser if($keys >= $min && $keys <= $max){<br>
>><br>
>><br>
>> Eu devo ser muito estúpido... mas alguém que está falando isso (ja é<br>
>> o 3o), poderia fazer o favor de me explicar porque ele deve usar && no<br>
>> lugar do 'and' e qual diferença isso faz no caso deste if específico?<br>
>> E em quais situações deve-se usar o 'and' no lugar de &&?<br>
>><br>
>> [ ]'s--<br>
>> Bruno C. Buss<br>
>> <a href="http://www.brunobuss.net" target="_blank">http://www.brunobuss.net</a> [1]<br>
>><br>
>><br>
>> Links:<br>
>> ------<br>
>> [1] <a href="http://www.brunobuss.net" target="_blank">http://www.brunobuss.net</a><br>
>><br>
>><br>
>> _______________________________________________<br>
>> Rio-pm mailing list<br>
>> <a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
>> <a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>
><br>
><br>
> _______________________________________________<br>
> Rio-pm mailing list<br>
> <a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
> <a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>
_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>
</div></div></blockquote></div><br>