在Perl中,如何|| 操作员工作?

K.T*_*K.T 6 perl

所以这是

$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.

  • @TLP,短路是指没有得到评估的*操作数*.由于有2个二元运算符,实际上有4个操作数.评估两个"||"的LHS,但仅评估最左侧"||"的RHS.1)评估`0 || 2`.2)评估"0".3)评估`2`.4)由于短路(LHS,'0 || 2`,返回true),不评估`4`. (5认同)

Chr*_*odd 8

它是一种短路,保值的逻辑或.基本上,它||依次评估每个事物,直到找到一个非假的,然后它返回那个并且不评估任何后续的操作数.

编辑

perl的逻辑运算有两个重要特征

  • 它们是短路的,因为它们首先评估左操作数,如果它是真的(假为&&)则不评估右操作数

  • 它们是值保留的,因为它们将操作数转换为布尔值true或false用于连接(并确定是否评估右操作数),但表达式的结果是转换为布尔值之前的原始值

这两个特性都非常重要,它们结合起来||在perl中特别有用 - 远远超过C/C++,它只是短路而不是值保留.

  • 如果操作数是性能和副作用的函数调用(或避免它们),则这尤其相关. (2认同)

TLP*_*TLP 5

虽然操作员看起来很相似,但他们的目的却不同.

来自perldoc perlop:

二进制"||" 执行短路逻辑或运算.也就是说,如果左操作数为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种人:理解二进制数的人和不理解二进制数的人.