$a = 5; $b = 20; if ($a = 10 || $b = 7) { $a++; $b++; } echo $a,"\n","",$b; //1 21
刚开始接触可能一眼看过去很容易说出最后的输出是5 20
可是仔细看后()
里的条件表达式是赋值操做,因此应该输出11 21
.可是计算机和咱们开了一个并很差笑的玩笑。她妹的,最后居然输出的是1 21
。php
计算机的思路和人脑的思路是有区别的,在编程的时候必须了解计算机的思惟模式:
机械式的思惟模式
。咱们人在判断这个逻辑表达式的时候会跳跃性的先对$a
和$b
赋值,而后再作与运算,这样作虽然不影响逻辑运算的结果,可是也会产生上面这种反作用。事实上,计算机为了节省资源,采起了短路运算的方式解释这个逻辑表达式。当他发现与运算符的前一个数值(例如$a
)是false
时,他就会判断这个与运算表达式的运算结果是false
,而后跳出这个逻辑运算表达式,继续执行下面的程序,而不会执行表达式剩下的语句。编程
至于这里为何$a
的值是1
? 是由于在条件表达式的时候$a = 10
的操做的时候php会把$a转换成boolean。上面的例子中$a = 10
即转换成了true
.因此在{}
中的$a++ 是不能进行加法运算的。可是若是花括号中的$a++
换成$a = $a + 1
那么此时就能够进行数值运算了。code
短路运算的精髓就是
逻辑与(&&)->检查运算符第一个表达式是否为false,若是false直接返回false,后续的表达式直接忽略。
逻辑或(||)->检查运算符第一个表达式是否为true,若是是true直接返回true,后续表达式直接忽略。
PS:&&的优先级高于and、||的优先级高于or、等号(=
)的优先级高于and
和or
资源
php<?php // 下面的 foo() 不会被调用,由于它们被运算符“短路”了。 $a = (false && foo()); $b = (true || foo()); $c = (false and foo()); $d = (true or foo()); // "||" 的优先级比 "or" 高 $e = false || true; // $e 被赋值为 (false || true),结果为 true $f = false or true; // $f 被赋值为 false [Altair注:"=" 的优先级比 "or" 高] var_dump($e, $f); // "&&" 的优先级比 "and" 高 $g = true && false; // $g 被赋值为 (true && false),结果为 false $h = true and false; // $h 被赋值为 true [Altair注:"=" 的优先级比 "and" 高] var_dump($g, $h); ?> //以上例程的输出相似于: bool(true) bool(false) bool(false) bool(true)