代码之家  ›  专栏  ›  技术社区  ›  user187291

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

  •  6
  • user187291  · 技术社区  · 14 年前

    只是个简单的问题

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

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

    编辑:我有兴趣知道这个Perl评估与C相比通常是如何被调用的。当你说“C示例是X,Perl示例不是X,而是Y”时,你会用哪个词来表示X和Y。“短路”不是我要找的。

    6 回复  |  直到 14 年前
        1
  •  6
  •   Gordon Gustafson    14 年前

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

    在这个特定的Perl片段中,是 null-coalescing operator ,如果第一个参数为空,则计算为第二个参数的二进制文件,否则计算为第一个参数。自从 99 是第一个参数,不为空,返回并打印。

    编辑:感谢Evan的分类:Perl中的运算符不是空合并运算符,如果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
    
        2
  •  9
  •   Norman Ramsey    14 年前

    正如你所指出的,你要找的词是 “短路”。短路评估是指在表达式中

    e1 || e2
    

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

    我知道你的区别 两种不同的短路或 但是在二十年的编程语言工作中,我从未见过这些东西的名字。Perl版本在动态语言中非常流行,例如icon、lua、scheme。

    Perl版本是 几乎 用C表示:

    e1 ? e1 : e2
    

    很遗憾,此版本可能会评估 e1级 两次,取决于优化器和if E1 有副作用,或者编译器无法判断 可以 有副作用,那么编译器是 必修的 对它进行了两次评估。这个缺陷可以通过绑定 E1 到一个新的局部变量,但这需要GNU扩展。

    C行为可以在Perl中通过

    !!(e1 || e2)
    
        3
  •  8
  •   Prasoon Saurav    14 年前

    here .

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

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


    printf(“%d”,99 44)在C中打印“1”

    那是因为 99||44 返回“真”(只有99个(非零)是由于 || )其等价物为 1 因此 printf() 印刷品 .

    打印99 44用Perl打印“99”

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

        4
  •  3
  •   Eli Bendersky    14 年前

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

    在C中,结果是 γ 是逻辑的,传递给 printf 结果为1或0。这也是短路,所以44甚至没有被评估。

        5
  •  1
  •   Michael Carman    14 年前

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

        6
  •  0
  •   Potatoswatter R. Martinho Fernandes    14 年前

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