last;<br><br><div class="gmail_quote">Em 4 de dezembro de 2012 14:54, 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">
<div class="im">> (my $d = $a) and $b;<br>
<br>
</div>Correto, conforme<br>
<a href="http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity" target="_blank">http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity</a><br>
<br>
A pegadinha (deixada como exercício) é que o operador de atribuição<br>
tem maior precedência que o operador 'and'.<br>
<br>
Por isso os exemplos usando atribuição estão se cagando todos:<br>
<div class="im"><br>
$c = $a && $b<br>
<br>
</div>é diferente de<br>
<br>
$c = $a and $b<br>
<br>
não por causa da diferença mística entre '&&' e 'and', mas por causa<br>
do operador de atribuição ter mais precedência que 'and' e menos<br>
precedência que o '&&';<br>
<br>
$c = $a && $b  <==> $c = ( $a && $b )<br>
$c = $a and $b <==> ($c = $a) and $b<br>
<br>
RTFM!<br>
<br>
[]'s<br>
<br>
2012/12/4 Junior Moraes <<a href="mailto:juniiior182@gmail.com">juniiior182@gmail.com</a>>:<br>
<div class="HOEnZb"><div class="h5">> Hi.<br>
><br>
> A diferença entre && e and não é apenas a questão da precedência dos<br>
> operadores?<br>
> Penso eu que essa questão não tenha nada a ver com short-circuiting, já que<br>
> 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<br>
> 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<br>
> Perl também.<br>
><br>
> []'s<br>
><br>
> Em 4 de dezembro de 2012 14:00, Blabos de Blebe <<a href="mailto:blabos@gmail.com">blabos@gmail.com</a>> escreveu:<br>
><br>
>> 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>
>> >> 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>
>> ><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<br>
>> > 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>
>> > <=<br>
>> > $max) se a primeira expressão for verdadeira. Ou seja, se $keys for<br>
>> > menor<br>
>> > que $min o Perl nem vai perder tempo checando pois 0 x N = 0. Então aqui<br>
>> > 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<br>
>> > 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<br>
>> >>> 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>
><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>