“基于价值”OR运算符的常用术语

时间:2010-01-31 16:44:00

标签: c++ c perl language-agnostic

只是一个简单的问题

 printf("%d", 99 || 44) prints "1" in C
 print 99 || 44 prints "99" in perl

有两种不同的评价方式。每个人都有名字吗?

编辑:我很想知道与C相比,这个Perl评估通常是如何调用的。当你说“C example是X,而perl示例不是X,而是Y”时,你将使用哪些单词作为X和Y.“短路”不是我想要的。

6 个答案:

答案 0 :(得分:9)

如您所知,您要找的字是“短路”。短路评估意味着在表达式中

e1 || e2

如果表达式e1被评估为代表真值的东西,那么就没有必要评估e2。 C和Perl都使用短路评估。

我知道你在两种不同风格的短路OR 中所做的区别,但是在编程语言工作的二十年里,我从未见过这些命名的东西。 Perl版本在动态语言中非常流行,例如Icon,Lua,Scheme。

Perl版本在C:

中几乎可表达
e1 ? e1 : e2

不幸的是,此版本可能会评估e1两次,具体取决于优化程序 - 如果e1有副作用,或者编译器无法判断它是否可能副作用,然后编译器需要评估它两次。可以通过将e1的值绑定到新的局部变量来修复此缺陷,但这需要GNU扩展。

可以通过

在Perl中模拟C行为
!!(e1 || e2)

答案 1 :(得分:8)

阅读here

  

二进制||执行短路逻辑OR运算。也就是说,如果左操作数为true,则甚至不评估右操作数。标量或列表上下文如果被计算,则向下传播到右操作数。

     

在Perl中||和&&运算符与C的不同之处在于,它们不是返回0或1,而是返回最后评估的值。


  

printf(“%d”,99 || 44)在C

中打印“1”

这是因为99||44返回true(由于||的短路动作,仅评估99(非零),其等价物为1因此{{ 1}}打印printf()

  

打印99 || 44在perl中打印“99”

..而不是返回0或1,返回最后评估的值(此处为1)。

答案 2 :(得分:6)

C版本使用||作为两个值之间的逻辑OR。 44和99都评估为C中的true,因为它们不是0,因此它们之间的OR结果返回1(C中的AKA true

在那个特定的perl片段中,||是null-coalescing operator,一个二进制文件,如果第一个参数为null,则计算第二个参数,否则计算第一个参数。由于99是第一个参数而不是null,因此会返回并打印它。

编辑:感谢Evan的clafication:|| perl中的operator不是null-coalescing运算符,如果LHS求值为false,则返回RHS,否则返回LHS。 //是“正确的”空合并运算符。

以下是perl中评估为false的值列表(from wikipedia)

$false = 0; # the number zero
$false = 0.0; # the number zero as a float
$false = 0b0; # the number zero in binary
$false = 0x0; # the number zero in hexadecimal
$false = '0'; # the string zero
$false = ""; # the empty string
$false = undef; # the return value from undef
$false = 2-3+1  # computes to 0 which is converted to "0" so it is false

答案 3 :(得分:3)

在Perl中,99 || 44返回99,因为||是“短路”,如果它的第一个参数在布尔上下文中为真,则它只返回它。 print打印99。

在C中,||的结果是合乎逻辑的,它传递给printf得到1或0.它也是短路的,所以44甚至没有被评估。

答案 4 :(得分:1)

C和Perl都将它们各自的||运算符称为“逻辑OR”(与逐位OR不同)。 Perl返回最后一个值而不是0或1的行为没有特殊名称。

答案 5 :(得分:0)

在C中,||布尔运算。在Perl中,它是 整数类型不可知操作,它恰好将第一个参数视为布尔值。这是唯一的区别。