php位运算符注意事项

$a = $b = $c = 0;
$a & $b = 1;
$b | $c = 1

 问a,b,c最终为多少?

 

当看到这题时,我犯了一个低级错误,误 以为位运算符会改变变量的值。所以得出结果是1 1 0

但是位运算符是不会改变变量的值的,例如:

$a=1;$b=2;
$a&$b;

 这样a,b的值不会有任何改变

 

再看到上面那题,先弄清一下运算符的优先级

运算符优先级 结合方向 运算符 附加信息
非结合 clone new clonenew
[ array()
非结合 ++ -- 递增/递减运算符
非结合 ~ - (int) (float) (string) (array) (object) (bool) @ 类型
非结合 instanceof 类型
右结合 ! 逻辑操作符
* / % 算术运算符
+ - . 算术运算符字符串运算符
<< >> 位运算符
非结合 < <= > >= <> 比较运算符
非结合 == != === !== 比较运算符
& 位运算符引用
^ 位运算符
| 位运算符
&& 逻辑运算符
|| 逻辑运算符
? : 三元运算符
= += -= *= /= .= %= &= |= ^= <<= >>= 赋值运算符
and 逻辑运算符
xor 逻辑运算符
or 逻辑运算符
, 多处用到

 由此得知位运算符的优先级是大于赋值运算符的

由此上面的代码亦可以写为

$a = $b = $c = 0;
$a&$b;
$b = 1;
$b | $c;
$c = 1;

 结果很明显a为0,b为1,c为1

位运算符 例子 名称 结果
$a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。
$a | $b Or(按位或) 将把 $a 或者 $b 中为 1 的位设为 1。
$a ^ $b Xor(按位异或) 将把 $a 和 $b 中不同的位设为 1。
~ $a Not(按位非) 将 $a 中为 0 的位设为 1,反之亦然。
$a << $b Shift left(左移) 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
$a >> $b Shift right(右移) 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

 

还有一个优级的例外:

if($a=100 && $b=200)
var_dump($a,$b);

 bool(true) int(200)

参考:http://www.laruence.com/2010/07/26/1668.html

你可能感兴趣的:(位运算,PHP,&)