先上一段代码
$a=10;
$b=20;
if ($a = 1 && $b = 2)
{
echo '分支1';
}
else
{
echo '分支2';
}
var_dump($a);
var_dump($b);
预测一下,这段代码的输出内容?
不知道你有没有猜对,这段代码的实际输出结果是
分支1bool(true) int(2)
前段时间偶然的一次错误发现了这个奇怪的问题,想了半天没想明白,一开始以为是if的问题,后来查了半天,最终确定是运算符优先级的问题。
因为&&运算符优先级高于=,所以if里的代码实际执行效果是
$a = (1 && ($b = 2))
所以最终$a被赋值成true,$b被赋值成2。(但是这里还有一个疑问,这里优先级最高的&&却让位给了低于其优先级的$b=2,关于这个问题恰巧在鸟哥的博客看到了类似的问题及其讨论,受益匪浅 点击打开链接)
最终是因为自己基本功不够扎实啊,赶紧恶补了一下相关知识。
关于运算符优先级的官方手册说明:http://php.net/manual/zh/language.operators.precedence.php
其实官方手册下边的评论也值得一看,有一些朋友也给出了一些需要注意的关于运算符优先级的可能遇到的问题。
例如
$bool = true && false;
var_dump($bool); // false, that's expected
$bool = true and false;
var_dump($bool); // true, ouch!
因为&&运算符优先级高于=,但是and运算符低于=,所以在使用不当的时候可能会产生与预期不符的执行效果,平时写代码时需要额外留意。
最后留下一个思考题,看看下边的代码会输出什么内容?
$a=10;
$b=20;
$c=30;
if ($a = 1 && $b = 2 && $c = 3)
{
echo '分支1';
}
else
{
echo '分支2';
}
var_dump($a);
var_dump($b);
var_dump($c);