use*_*291 6 c c++ language-agnostic perl
只是一个简单的问题
printf("%d", 99 || 44) prints "1" in C
print 99 || 44 prints "99" in perl
Run Code Online (Sandbox Code Playgroud)
有两种不同的评估方式.每个人都有名字吗?
编辑:我很想知道与C相比,这个Perl评估是如何被普遍调用的.当你说"C example是X,而perl示例不是X,而是Y"时,你将使用哪些单词用于X和Y."短路"不是我想要的.
如您所知,您正在寻找的词语不是 "短路".短路评估意味着在表达中
e1 || e2
Run Code Online (Sandbox Code Playgroud)
如果表达式e1
被评估为代表真理的东西,那么就没有必要进行评估e2
.C和Perl都使用短路评估.
我知道你在两种不同的短路OR方面所做的区别,但是在编程语言工作的二十年里,我从未见过这些命名的东西.Perl版本在动态语言中非常流行,例如Icon,Lua,Scheme.
Perl版本几乎可以在C中表达:
e1 ? e1 : e2
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个版本可能会评估e1
两次,具体取决于优化器 - 如果e1
有副作用,或者编译器无法判断它是否有副作用,那么编译器需要对其进行两次评估.可以通过将值绑定e1
到新的局部变量来修复此缺陷,但这需要GNU扩展.
可以在Perl中模拟C行为
!!(e1 || e2)
Run Code Online (Sandbox Code Playgroud)
C版本使用|| 作为两个值之间的逻辑OR.44和99都true
在C中求值,因为它们不是0
,因此它们之间的OR的结果返回1
(true
C中的AKA )
在那个特定的perl片段中,|| 是null-coalescing运算符,一个二进制文件,如果第一个参数为null,则计算第二个参数,否则计算第一个参数.由于99
是第一个参数而不是null,因此返回并打印.
编辑:感谢Evan的clafication:|| perl中的operator不是null-coalescing运算符,如果LHS求值为false,则返回RHS,否则返回LHS.//
是"适当的"null-coalescing运算符.
这是perl中值为false的值列表(来自维基百科)
$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
Run Code Online (Sandbox Code Playgroud)