只是一个简单的问题
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.“短路”不是我想要的。
答案 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中,它是 整数类型不可知操作,它恰好将第一个参数视为布尔值。这是唯一的区别。