据我所知,按位运算符对所有相应的位执行检查,如下所示:
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真比特和假:0
真比特 假: 1致命错误:第 21 行的 C:''Abyss Web Server''htdocs''handler.php 中不支持的操作数类型
因此,由此,我有两个问题:
- 如果我们(看起来(可以在布尔值上使用
&
和|
,那么&&
和||
有什么意义呢? - 为什么我不能执行
~true
(或者换句话说,为什么不支持布尔值(?对我来说,~true
返回false
听起来合乎逻辑。
我确实想出了一件事,即&&
和||
(有时(会将值转换为bool
然后返回正确的结果,如果我们(错误地(碰巧传递了一个不属于 bool
类型的值。但要解决这个问题,我们不能先做一个演员吗?如:
if ((bool)$foo & (bool)$bar) { ...
感觉就像我在这里错过了一个改变一切的主要部分......但以防万一我没有,我包含了尽可能多的信息。有人可以通过回答我的两个问题让我更好地理解这一点吗?在这一点上我很困惑,我已经考虑了很长一段时间。
答案 1
布尔表达式的某些部分(||
、&&
、!
、...(仅在需要时(从左到右(进行计算:
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
答案 2
~true
似乎没有意义:true
是0x00...01
的,~true
将是0xff...fe
而不是false
0x000...0
:
var_dump(~((int)true)); // prints: int(-2)
echo dechex(~((int)true)); // prints: fffffffffffffffe
请改用!
运算符:
var_dump(!true); // prints: bool(false)
简历
仅当需要更改位时才使用按位运算符。
true
和false
布尔标志,尽管作为 32 位或 64 位值存储在内存中,但应被视为双状态布尔值。您最终只会在短臂护罩上使用它,因此您不应该对它们进行算术。 &&
和 ||
计算为布尔标志、按位运算符和 |计算为操作数的相同(例如 int & int
计算为 int
,int && int
计算为布尔值(。
故事是这样的:当您必须对某些条件做出决定时,请使用&&
和||
。使用 &
和 |
对值执行布尔算术。
这就是C++
C 没有任何内置的布尔值,所以任何非零值都是true
,零是false
。