怎么做||和&&返回值表示法有效吗?

时间:2013-02-19 10:04:02

标签: bash

许多人在脚本语言中使用下面的符号,但我不太明白它是如何工作的。

~$ false || echo "aa"
aa
~$ true || echo "aa"
~$ true && echo "aa"
aa
~$ false && echo "aa"
~$ 

双方是否先执行,然后评估其返回值?

什么是更直接的写这些方式?

||XOR吗?

4 个答案:

答案 0 :(得分:1)

这称为Short Circuit Evaluation

||是OR(不是异或)。

使用脚本(与源代码一样),只有在必要时才会评估权限。

带有||

如果LHS评估为假或0,则评估RHS。使用&&时,RHS仅在LHS评估为真时进行评估。

那是因为真的||任何事情都是正确的,所以没有必要评估RHS。虚假&&任何事情总是错误的。

另见Benefits of using short-circuit evaluation

答案 1 :(得分:1)

||&&在您列出的所有语言中都是懒惰的。

它的工作方式是从左到右评估表达式。在||的情况下,整个表达式的值是第一个参数的值,它不是“false-y”(或者最后一个参数,如果所有参数都是false-y)将是值表达。

答案 2 :(得分:1)

我认为这很简单。

每次首先评估左侧,如果需要,评估右侧。

在第一种情况下,LHS是false,因此表达式的结果取决于RHS,因为它是OR操作。所以评估/执行右侧。

在第二种情况下,LHS为trueOR操作的结果将为true,无论RHS中有什么,因此RHS永远不会被评估/执行。

AND操作也会发生同样的事情。只有当LHS与第3个陈述中true一样时,它才需要评估RHS。

答案 3 :(得分:1)

使用&&||来控制评估是非常重要的事情 节目。正如许多人已经回答的那样,他们正在使用“短路评估” 在某些语言中,它们与andor相同,但不是全部。在例如 他们做的Ruby 意思完全相同(据我所知)。

  

什么是更直接的写这些方式?

您可以说使用&&||代替if ... else是懒惰的 编程,但有些人会说使用&&||结构 最直接的。

如果您将有另一种选择(或更好地理解这一点):

expr && echo "aa"

# is the same as

if expr; then
  echo "aa"
fi

expr || echo "aa"

# is the same as

if ! expr; then
  echo "aa"
fi

expr && echo "yes" || echo "no"

# is the same as

if expr; then
  echo "yes"
else
  echo "no"
fi

当然是混合

if this && that; then
  echo "yes"
else
  echo "no"
fi

“短路评估”是一个非常重要的规则,在某些情况下 代码依赖于此的情况。
在这个例子中(来自VIM,但它在许多语言中是相同的)如果它不起作用将会有一个例外:

if exists("variable") && variable == 3 ...

如果在决定结果之前对双方进行了评估,那么将会有一个 如果未定义variable,则会出现异常。

有一些设计不好的语言,其中包括&&是 在给出结果之前进行评估,使用它们并不是那么有趣。

所以:

if you like it; then
  use it && be happy
else
  use it || be happy
fi