所以这是
$y = 0 | 2 | 4; # answer is 6
$x = 0 || 2 || 4; # answer is 2
Run Code Online (Sandbox Code Playgroud)
我知道为什么$y,6因为它OR在每个数字上使用运算符,2 | 4 = 6但是$x...
为什么2?
D.S*_*ley 13
因为2是第一个非虚假项目和逻辑OR短路.它计算为零,这是假,然后是2,这不是假,所以它完成并返回2.考虑以下示例的输出:
$val = 1;
sub a_proc {
print "a_proc: ", $val++, "\n";
1;
}
$another_val = &a_proc || &a_proc;
Run Code Online (Sandbox Code Playgroud)
这将输出a_proc: 1.一旦a_proc返回真值,解释器就可以停止评估,因为逻辑OR true和任何值都是true.
它是一种短路,保值的逻辑或.基本上,它||依次评估每个事物,直到找到一个非假的,然后它返回那个并且不评估任何后续的操作数.
编辑
perl的逻辑运算有两个重要特征
它们是短路的,因为它们首先评估左操作数,如果它是真的(假为&&)则不评估右操作数
它们是值保留的,因为它们将操作数转换为布尔值true或false用于连接(并确定是否评估右操作数),但表达式的结果是转换为布尔值之前的原始值
这两个特性都非常重要,它们结合起来||在perl中特别有用 - 远远超过C/C++,它只是短路而不是值保留.
虽然操作员看起来很相似,但他们的目的却不同.
二进制"||" 执行短路逻辑或运算.也就是说,如果左操作数为true,则甚至不评估右操作数.
相比:
二进制"|" 返回其操作数一点一点地进行OR运算.
的目的||是要拿出一个答案为"是x || y真是假?",而目的bitwise or- - |(?)"是什么的结果就是拿出一个产品的操作数,或者类似的东西x | y?"
由于唯一有趣的两个结果||是真或假,该陈述可以(并且是)短路,从而导致这种效果.
在第一个声明中: (0 | 2) = 2, (2 | 4) = 6
在第二个声明中: (0 || 2) = 2, (2 || ...) = 2
有趣的是,bitwise or在二进制数内设置布尔值.在数字的二进制表示内的位置上添加true或false值.
0000 | 0010 = 0010
0010 | 0100 = 0110
0110 | 0001 = 0111
0111 | 0001 = 0111 # no change
Run Code Online (Sandbox Code Playgroud)
这对于在一个数字中存储多个布尔值非常方便,可以使用&(bitwise AND)进行检查.
0101 & 0100 = 0100 (true)
0101 & 0010 = 0000 (false)
Run Code Online (Sandbox Code Playgroud)
有10种人:理解二进制数的人和不理解二进制数的人.