许多人在脚本语言中使用下面的符号,但我不太明白它是如何工作的。
~$ false || echo "aa"
aa
~$ true || echo "aa"
~$ true && echo "aa"
aa
~$ false && echo "aa"
~$
双方都先执行,然后评估它们的返回值吗?
写这些更直接的方法是什么?
是||
一个XOR
?
许多人在脚本语言中使用下面的符号,但我不太明白它是如何工作的。
~$ false || echo "aa"
aa
~$ true || echo "aa"
~$ true && echo "aa"
aa
~$ false && echo "aa"
~$
双方都先执行,然后评估它们的返回值吗?
写这些更直接的方法是什么?
是||
一个XOR
?
||
并且&&
在您列出的所有语言中都很懒惰。
它的工作方式是从左到右计算表达式。在 的情况下||
,整个表达式的值是不是“false-y”的第一个参数的值(或最后一个参数,如果所有参数都是 false-y)将是表达式的值。
我认为这很简单。
每次首先评估左侧,如果需要,评估右侧。
在第一种情况下,LHS 是false
,因此表达式的结果取决于 RHS,因为它是一个OR
操作。所以右侧被评估/执行。
在第二种情况下,LHS 是true
,并且OR
操作的结果将true
与 RHS 中的内容无关,因此永远不会评估/执行 RHS。
手术也会发生同样的事情AND
。true
只有当 LHS与第 3 条语句相同时,它才需要评估 RHS 。
使用&&
和||
控制评估是编程中非常基础的事情。正如许多人已经回答的那样,他们正在使用“短路评估”。
在某些语言中,它们与 and 相同and
,or
但并非全部相同。在例如 Ruby 中,它们的含义并不完全相同(据我所知)。
写这些更直接的方法是什么?
你可以说使用&&
and||
而不是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
未定义,则会出现异常。
有一些设计不好的语言,在&&
给出结果之前对 eg 的两边都进行了评估,它们使用起来并不那么有趣。
所以:
if you like it; then
use it && be happy
else
use it || be happy
fi