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

时间:2011-08-03 13:26:41

标签: php perl operator-precedence

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会怎么样?

5 个答案:

答案 0 :(得分:10)

关于Perl:

与PHP(但像Python,JavaScript等)不同,布尔运算符不返回布尔值,但使表达式为真(或最后一个值)的值确定最终结果表达式source)。

$b=1 && $a=5

评估为

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

$b = (1 && 5)相同(赋值“返回”指定的值)并将5分配给$b


底线是:Perl和PHP中的运算符优先级相同(至少在这种情况下),但它们的不同之处在于布尔运算符返回的值。

FWIW,可以找到PHP的运算符优先级here


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

因此,如果$btrue,那么$b++会将值保留为true,例如$b += 12分配给$b


†:我的意思是它返回第一个(最左边)值

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

或表达式的最后一个值。

答案 1 :(得分:6)

第一个例子

$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 inob但我可以建议&& b返回a或b(如果所有这些都转换为bool,则返回最后一个),而不是布尔值,然后$ b =(1&& $ a = 5)返回$ b = 5(是5)

答案 2 :(得分:4)

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

,则会得到预期的结果

答案 3 :(得分:2)

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

在++之后你得到6-2。

答案 4 :(得分:0)