-1

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

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

双方都先执行,然后评估它们的返回值吗?

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

||一个XOR

4

4 回答 4

1

这称为短路评估

||是 OR(不是 XOR)。

使用脚本(与源代码一样)仅在必要时评估右侧。

||如果 LHS 评估为假或 0,则评估 with the &&RHS。仅当 LHS 评估为 true 时,评估 with the RHS。

那是因为真|| 任何事情都是正确的,因此无需评估 RHS。而假的 && 任何东西总是假的。

另请参阅使用短路评估的好处

于 2013-02-19T10:07:00.770 回答
1

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

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

于 2013-02-19T10:07:30.240 回答
1

我认为这很简单。

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

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

在第二种情况下,LHS 是true,并且OR操作的结果将true与 RHS 中的内容无关,因此永远不会评估/执行 RHS。

手术也会发生同样的事情ANDtrue只有当 LHS与第 3 条语句相同时,它才需要评估 RHS 。

于 2013-02-19T10:16:45.330 回答
1

使用&&||控制评估是编程中非常基础的事情。正如许多人已经回答的那样,他们正在使用“短路评估”。
在某些语言中,它们与 and 相同andor但并非全部相同。在例如 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
于 2013-02-19T12:05:16.467 回答