聘我网

新概念招聘3.0

PHP和Perl中and与&&优先级引起的问题

vote up0vote downstar

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优先级高,但仍然有上面这两个疑问。。

 

1 个答复

vote up0vote downcheck

首先PHP:

$a = 2; 
$b = 3; 
if($b=1 && $a=5)  //等于$b = (1 && $a=5)
{
    var_dump($b); //bool(true) 因为上面的&&运算
    $a++; 
    $b++;//布尔值++或--值不变
}

这就是为何输出1了。

然后Perl

$b=1 && $a=5 

等价于

$b=(1 && $a=5)

但跟PHP不同的是,Perl中的&&返回的是第一个使表达式为false的值,或者(表达式为true时)最后一个值(1&&5等于5,1&&0&&5等于01&&undef&&5等于undef, Python, JavaScript等等也是如此),所以这里$b就是5了。

再看个例子:

[root@ perl]# perl -e 'print 1&&5'
5
[root@ perl]# php -r 'echo 1&&5;'
1

这就是区别!

总而言之,这两个例子中操作符优先级的影响是相同的,不同的是PHPPerl对于$a && $b内插的方式。

链接

您的回答





不是您要找的问题? 浏览其他含有标签 的问题或者 自己问个.