首先看下面的这段代码会输出什么结果:

1
2
3
4
5
6
7
$a = 3;
$b = 5;
if ($a = 5 || $b = 7) {
$a++;
$b++;
}
var_dump($a, $b);

大概会出现以下两种错误理解:
1.把 $a=5、$b=7 看成了 $a==5、$b==7
错误结果:3,5
2.运算符的优先级,认为 $a=5 赋值成功 $b=7 没执行
错误结果:6,6
正确答案:

1
bool(true) int(6)

为什么会这样?因为赋值运算符(=)的优先级是最低的,所以正确理解应该是:

1
$a=(5||$b=7)

还需要注意的是,var_dump此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。
再扩展一下,看下面两道题分别输出什么:

1
2
3
4
5
6
7
8
9
10
$a = 3;
$b = 6;
$c = 1;
if ($a = 5 || $b = 7 && $c = 10) {
$a++;
$b++;
}
echo $a.','.$b.','.$c.'
';
var_dump($a,$b,$c);

结果:

1
2
1,7,1
bool(true) int(7) int(1)

需要注意的是echo是语言结构(language construct),而并不是真正的函数,true 和 false 当是数字类型的时候,它就代表着 0 和 1。
再看看下面这段代码:

1
2
3
4
5
6
7
8
9
10
$a = 3;
$b = 6;
$c = 1;
if ($a = 0 || $b = 7 && $c = 10) {
$a++;
$b++;
}
echo $a.','.$b.','.$c.'
';
var_dump($a,$b,$c);

这里就不写结果了,有兴趣的可以去思考一下。

最后更新: 2018年01月06日 16:29

原始链接: http://blog.minhow.com/2017/02/10/php/operator-precedence/

× 请我吃糖~
打赏二维码