许多人在脚本语言中使用下面的符号,但我不太明白它是如何工作的。
~$ 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