据我所知,按位运算符对所有相应位执行检查,如下所示:
echo 64 | 32; //prints 96
echo 'a' & 'b'; //prints `
当条件运算符&&
和||
运算符对布尔值执行操作时:
echo (int)(true && false); //prints: 0
echo (int)(true || false); //prints: 1
当我(脑海中)想要预测按位运算的结果时,我首先将这些值转换为它们的二进制表示形式(取决于数据类型)。此后,我将其逐位比较,然后将结果转换为合适的输出类型(我猜这是由操作数确定的)。尽管在某一时刻,我尝试对布尔值执行相同的操作(据我所知),布尔值仅由内存中的一位组成,true
与相对应1₂
,与false
相对应0₂
(与二进制相对)。因此,对这些值执行按位运算应产生与&&
和相似的结果||
,对吗?为了说明我的意思:
true & false => 1₂ & 0₂ => 0₂ => false
true | false => 1₂ | 0₂ => 1₂ => true
~true => ~1₂ => 0₂ => false
(不包括xor
,因为没有相应的条件布尔运算符。)
在我看来,该行为实际上应该等同于条件运算符:
true && false => false
true || false => true
!true => false
因此,我将以下代码设置为对其进行测试:
echo "true AND false: " . ((true && false) ? "1" : "0") . "<br />\n";
echo "true OR false: " . ((true || false) ? "1" : "0") . "<br />\n";
echo "NOT true: " . ((!true) ? "1" : "0") . "<br />\n";
echo "<br />\n";
echo "true BITAND false: " . ((true & false) ? "1" : "0") . "<br />\n";
echo "true BITOR false: " . ((true | false) ? "1" : "0") . "<br />\n";
echo "BITNOT true: " . ((~true) ? "1" : "0") . "<br />\n";
它给了我以下输出:
正确和错误:0
正确或错误:1
不正确:0真BITAND假:0
真BITOR假:1致命错误:第21行的C:\ Abyss Web Server \ htdocs \ handler.php中不支持的操作数类型
因此,我有两个问题:
&&
和||
,如果我们(因为它似乎)可以使用&
和|
布尔值呢?~true
(或者换句话说,为什么不支持布尔值)?对我来说,听起来很合逻辑,然后又~true
回来了false
。我没有拿出一个东西,在于&&
和||
会(有时)投下的值代入bool
,之后返回正确的结果,如果我们(错误地)会发生在传递一个值的类型不是bool
。但是要解决这个问题,我们不能先做演员吗?如:
if ((bool)$foo & (bool)$bar) { ...
感觉好像我在这里遗漏了一个会改变所有内容的主要内容...但是,以防万一,我没有提供尽可能多的信息。有人可以回答我的两个问题,使我对此有所了解吗?在这一点上我很困惑,并且我已经考虑了很长时间。
一个布尔表达式的零件(||
,&&
,!
,...)仅在需要时(从左至右)评价:
if ($a | func()) { } // func is always called
if ($a || func()) { } // func is not called if $a is true,
// because expression is true whatever func will return
if ($a && func()) { } // func is not called if $a is false,
// because expression is false whatever func will return
func() || exit(); // exit() will be called if func() returns false
看一下文档:http : //php.net/manual/en/language.operators.logical.php
~true
似乎没有意义:true
is 0x00...01
and ~true
will be 0xff...fe
and not false
0x000...0
:
var_dump(~((int)true)); // prints: int(-2)
echo dechex(~((int)true)); // prints: fffffffffffffffe
使用!
-operator代替:
var_dump(!true); // prints: bool(false)
仅在需要更改位时才使用按位运算符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句