$a=3;
$b=6;
$c=1;
if($a=5||$b=7 && $c=10){
var_dump($a, $b,$c);//bool(true) int(6) int(1)
$a++;
$b++;
}
var_dump($a, $b,$c);//bool(true) int(7) int(1)
请问为什么会这样输出?
$a=3;
$b=6;
$c=1;
if($a=5||$b=7 && $c=10){
var_dump($a, $b,$c);//bool(true) int(6) int(1)
$a++;
$b++;
}
var_dump($a, $b,$c);//bool(true) int(7) int(1)
请问为什么会这样输出?
2 回答3.1k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
1 回答1.3k 阅读✓ 已解决
2 回答1.2k 阅读
1 回答1.2k 阅读
1 回答1k 阅读
虽然你的这个判断写的奇奇怪怪的,不过我想应该是故意的吧,应该不是书写BUG。
这个并不是PHP的BUG,而是你自己没有好好理解运算符的优先级的问题,建议看看这个:
把你的那个判断加上括号,那么你可以这么理解这个逻辑判断
你可以把括号加上放到程序中测试,结果也还是一样的。从上面我们就可以看出,由于
=
的优先级是最低的,所以先执行了( 5 || ( ( $b = 7 ) && ( $c = 10 ) ) )
。由于&&
的操作符优先级大于||
,所以从先进行右操作,最后5
这个数字被程序判断为true
。至于为什么可以看手册:转换为布尔值根据
或
操作原则。二者中只要有一者判断为true
则立即结束判断,所以或
操作后面的都不执行了。最后将true
赋值给$a
变量。这就是为什么只有$a
变量的值变了,而$b
和$c
没变的原因。你可以把逻辑判断改成这样:
看看结果是什么?
由于
0
被程序认定为false
,所以或操作得以继续执行。或操作的右边是与操作,由于是两个赋值操作,所以是true
,fase or true
的值也是true
,所以$a=true
,$b=7
,$c=10
另外,增加括号可以提高优先级,如果要达到复制的目的,我们可以这样做
补充:
看到程序主体,忘记看下面的
++
了,其实下面还有一个需要我们注意的就是$a++
这个操作,++
是递增操作,但是为什么得到的结果还是true
呢?通过查阅手册,我们能发现,虽然很短,但是这句话对我们的帮助非常之大:至此,程序的真相大白于天下了。至于为什么PHP会做这样的设定,可能是因为PHP是用C编写的原因(个人臆测,不可信)。
所以程序告诉我们一件事,所想并非所得,要善于怀疑自己。以上!