Perl和PHP中的运算符优先级问题


Operator precedence issue in Perl and PHP

PHP:

$a = 2;
$b = 3;
if($b=1 && $a=5)
{
   $a++;
   $b++;
}
echo $a.'-'.$b;

$a = 2;
$b = 3;
if($a=5 and $b=1)
{
   $a++;
   $b++;
}
echo $a.'-'.$b;

输出6-16-2。我不理解这里的1

Perl:

$a = 2;
$b = 3;
if($b=1 && $a=5)
{
     $a++;                                                                            
     $b++;
}
print $a.'-'.$b;

$a = 2;
$b = 3;
if($a=5 and $b=1)
{
    $a++;
    $b++;
}
print $a.'-'.$b;

输出6-66-2,我不理解这里的第二个6

有人知道原因吗?

事实上,我知道&&的优先级高于and,但当我知道这一点时,我仍然心存疑虑。

更新

现在我理解了PHP,Perl呢?

关于Perl:

与PHP(但与Python、JavaScript等类似(不同,布尔运算符不返回布尔值,但

使表达式为true的值(或最后一个值(决定了表达式的最终结果(源(。
$b=1 && $a=5

被评估为

$b = (1 && $a=5) // same as in PHP

与CCD_ 7相同(赋值"返回"赋值(,并将CCD_。


底线是:Perl和PHP中的运算符优先级是相同的(至少在本例中是这样(,但布尔运算符返回的值不同。

FWIW,PHP的运算符优先级可以在这里找到。


更有趣的是(至少这对我来说是新的(PHP不执行递增/递减运算符的类型转换。

因此,如果$btrue,则$b++将该值保留为true,而例如$b += 12分配给$b


†:我的意思是,它返回

  • &&的情况下评估为false
  • ||的情况下评估为true

或表达式的最后一个值。

第一个示例

$a = 2;
$b = 3;
if($b=1 && $a=5)  // means $b = (1 && $a=5)
{
   var_dump($b); //bool(true) because of &&
   $a++;
   $b++; //bool(true)++ ==true, ok
}
echo $a.'-'.$b;

希望你不会在生产中使用这些代码(

我不懂perl,但我可以建议使用&b返回a或b(如果它们都转换为bool,则返回最后一个(,而不是布尔值,则$b=(1&&$a=5(返回$b=5(is 5(

问题是:1&5在perl中返回5。如果将条件编码为if(($b=1) && ($a=5))

,则会得到预期的结果

对于Perl,图2:and在Perl中的优先级非常低,它不是&&的同义词。因此,样本作为(($a = 5) and ($b = 1))执行,CCD_24将$a和$b分别设置为5和1,并返回最后一个参数的值(即1(。

++之后,你会得到6-2。

请参阅http://sillythingsthatmatter.in/PHP/operators.php例如