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 <thiagogla...@ticursos.net>: >> 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 <thiagogla...@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@pm.org >> http://mail.pm.org/mailman/listinfo/rio-pm > > > _______________________________________________ > Rio-pm mailing list > Rio-pm@pm.org > http://mail.pm.org/mailman/listinfo/rio-pm _______________________________________________ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm