许多人在脚本语言中使用下面的符号,但我不太明白它是如何工作的。
~$ false || echo "aa"
aa
~$ true || echo "aa"
~$ true && echo "aa"
aa
~$ false && echo "aa"
~$
双方是否先执行,然后评估其返回值?
什么是更直接的写这些方式?
||
是XOR
吗?
答案 0 :(得分:1)
||
是OR(不是异或)。
使用脚本(与源代码一样),只有在必要时才会评估权限。
带有||
的如果LHS评估为假或0,则评估RHS。使用&&
时,RHS仅在LHS评估为真时进行评估。
那是因为真的||任何事情都是正确的,所以没有必要评估RHS。虚假&&任何事情总是错误的。
答案 1 :(得分:1)
||
和&&
在您列出的所有语言中都是懒惰的。
它的工作方式是从左到右评估表达式。在||
的情况下,整个表达式的值是第一个参数的值,它不是“false-y”(或者最后一个参数,如果所有参数都是false-y)将是值表达。
答案 2 :(得分:1)
我认为这很简单。
每次首先评估左侧,如果需要,评估右侧。
在第一种情况下,LHS是false
,因此表达式的结果取决于RHS,因为它是OR
操作。所以评估/执行右侧。
在第二种情况下,LHS为true
,OR
操作的结果将为true
,无论RHS中有什么,因此RHS永远不会被评估/执行。
AND
操作也会发生同样的事情。只有当LHS与第3个陈述中true
一样时,它才需要评估RHS。
答案 3 :(得分:1)
使用&&
和||
来控制评估是非常重要的事情
节目。正如许多人已经回答的那样,他们正在使用“短路评估”
在某些语言中,它们与and
和or
相同,但不是全部。在例如
他们做的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