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

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."短路"不是我想要的.

Nor*_*sey 9

如您所知,您正在寻找的词语不是 "短路".短路评估意味着在表达中

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)


Pra*_*rav 8

阅读这里.

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

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


printf("%d",99 || 44)在C中打印"1"

这是因为99||44返回true(由于短路作用而仅评估99(非零)||),1因此其等效值被printf()打印1.

打印99 || 44在perl中打印"99"

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


Gor*_*son 6

C版本使用|| 作为两个值之间的逻辑OR.44和99都true在C中求值,因为它们不是0,因此它们之间的OR的结果返回1(trueC中的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)

  • re:*在那个特定的perl片段中,|| 是null-coalescing运算符,如果第一个参数为null,则二进制计算结果为第二个参数* - 它肯定是**NOT**null-coalescing.是的,`undef || 死'会死,但'0 ||也会死 die`.`||`计算LHS,如果返回false,则评估RHS.undef恰好评价为假(感谢上帝).相反,`//`是5.10中引入的null-coalescing运算符,如果LHS为null,**将仅触发RHS,在此之前你可以做`(定义$ a)|| die` (4认同)