2011-08-03 28 views
8

PHP:运算符优先级问题,在Perl和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有更高的优先级,但我还是有把握的时候才知道这一点。

UPDATE

现在我明白了一个PHP,什么Perl的一个?

回答

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 += 1分配2$b


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

  • 计算为false&&
  • 情况的||
  • 情况评估为 true

或表达式的最后一个值。

+0

在Python中,它首先将错误转换为false或最后一个返回。我认为Perl的做法是一样的 – RiaD

+0

@JeRog - 一个'&&'表达式将停止评估何时遇到一个错误的值,因此在'1 && 0 && 5'中,'0'是最后一个值。同样,'1 && undef && 5'将评估为'undef'。 – mob

+1

@Je Rog如果左边的参数为false,则返回左边的参数;无论如何,它都会返回正确的论点。如果左参数为true,则返回它的左参数,否则返回它的正确参数。所以'&&'链返回最左边的假值(或者如果全部为真,则返回最后一个值),而一串'||'返回最左边的真值(或者最后一个值,如果全部为假)。 – hobbs

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的菜鸟,但我可以提出一个& & B返回或b(他们最后如果它们全部转换为bool),不布尔值,则$ b =(1 & & $ A = 5)返回$ b = 5(在5)

+0

+ 1,我现在明白了'1'。 –

+0

这非常有洞察力,但没有回答OP的问题。为什么php认为'$ b'是布尔值?在OP的例子中,perl正在做什么? – Asaph

+0

让你想知道如果把这个任务放在一个有条件的暗示的PHP中,你想要一个布尔值而不是一个数字,所以它会转换成错误的类型... –

4

这里的问题:1 & & 5返回5 Perl编写的。如果您将条件编码为if(($b=1) && ($a=5))

2

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

++之后你得到6-2。