last; Em 4 de dezembro de 2012 14:54, Blabos de Blebe <[email protected]> escreveu:
> > (my $d = $a) and $b; > > Correto, conforme > http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity > > A pegadinha (deixada como exercício) é que o operador de atribuição > tem maior precedência que o operador 'and'. > > Por isso os exemplos usando atribuição estão se cagando todos: > > $c = $a && $b > > é diferente de > > $c = $a and $b > > não por causa da diferença mística entre '&&' e 'and', mas por causa > do operador de atribuição ter mais precedência que 'and' e menos > precedência que o '&&'; > > $c = $a && $b <==> $c = ( $a && $b ) > $c = $a and $b <==> ($c = $a) and $b > > RTFM! > > []'s > > 2012/12/4 Junior Moraes <[email protected]>: > > Hi. > > > > A diferença entre && e and não é apenas a questão da precedência dos > > operadores? > > Penso eu que essa questão não tenha nada a ver com short-circuiting, já > que > > logicamente falando ambas fazem a mesma operação. > > > > Exemplificando, quando temos: > > use Data::Printer; > > my $a = 1; > > my $b = 0; > > > > my $c = $a && $b; > > my $d = $a and $b; > > p $c; > > p $d; > > > > O valor de $c seria FALSE, mas o valor de $d seria TRUE. > > Isso, porque, pela precedência dos operadores, a última operação é a > mesma > > coisa que: > > (my $d = $a) and $b; > > > > Deste modo, $d sempre resultará em TRUE, ignorando o $b. > > > > Isto é, pelo menos é assim em outras linguagens e pelo que me parece, no > > Perl também. > > > > []'s > > > > Em 4 de dezembro de 2012 14:00, Blabos de Blebe <[email protected]> > escreveu: > > > >> Desculpa, > >> > >> Não entendi a diferença entre: > >> > >> perl -E 'sub a{say 1} sub b{say 2} if (a() && b()){}' > >> perl -E 'sub a{say 1} sub b{say 2} if (a() and b()){}' > >> > >> perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() && b()){}' > >> perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() and b()){}' > >> > >> Até onde eu sei, não existe operador de short circuit. O short circuit > >> é uma propriedade, uma otimização na avaliação de expressões lógicas. > >> > >> Alguém estamos viajando? > >> > >> []'s > >> > >> 2012/11/30 <[email protected]>: > >> >> 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 <[email protected]> > >> >> > >> >>> 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 > >> >> [email protected] > >> >> http://mail.pm.org/mailman/listinfo/rio-pm > >> > > >> > > >> > _______________________________________________ > >> > Rio-pm mailing list > >> > [email protected] > >> > http://mail.pm.org/mailman/listinfo/rio-pm > >> _______________________________________________ > >> Rio-pm mailing list > >> [email protected] > >> http://mail.pm.org/mailman/listinfo/rio-pm > > > > > > > > _______________________________________________ > > Rio-pm mailing list > > [email protected] > > http://mail.pm.org/mailman/listinfo/rio-pm > _______________________________________________ > Rio-pm mailing list > [email protected] > http://mail.pm.org/mailman/listinfo/rio-pm >
_______________________________________________ Rio-pm mailing list [email protected] http://mail.pm.org/mailman/listinfo/rio-pm
