PHP:运算符优先级

4

我在http://www.phpinterviewquestions.com/php-interview-questions/operator-precedence/上发现了这个问题。

以下操作是真还是假?(运算符优先级)

$one = true;
$two = null;
$a = isset($one) && isset($two);
$b = isset($one) and isset($two);

echo $a.'<br>';
echo $b;

我尝试了上面的代码。但是只有$b被输出为1(也就是真)。$a没有被输出。可能的原因是什么?我本来以为$a应该是0(假)。

2个回答

6

这不是关于优先级的问题,而是隐式类型转换的问题。

使用var_dump($a);代替echo $a;

$a实际上是false,但被echo输出时false会被转换为空字符串。


1

我认为@zerkms的回答(虽然没错)并不是正确答案。

@vaanipala 的问题(我认为)是为什么$btrue$afalse,如果两个变量都由基本上相同的表达式生成。

是的,这与PHP运算符优先级有关。

$a = isset($one) && isset($two);可以重写为

$a = (isset($one)) && (isset($two));

这里没有什么新奇的东西,括号实际上是多余的。但是,andor运算符比赋值运算符优先级低,因此该行代码为:

$b = isset($one) and isset($two);

内部分组如下:

($b = isset($one)) and (isset($two));

第一个括号的值为true(因为=的优先级高于and),该值被分配给$bisset($two)false,因此最后一行被处理为:

true and false

该运算符的结果是false,但它没有任何作用。 所以...最终 $afalse$btrue证毕:-D


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接